Fortran
C 상호 운용성
수색…
Fortran에서 C 호출하기
Fortran 2003은 C와 Fortran (그리고 C를 중개자로 사용하여 더 많은 언어들) 간의 상호 운용성을 보장 할 수있는 언어 기능을 도입했습니다. 이러한 기능은 대개 내장 모듈 iso_c_binding
통해 액세스됩니다.
use, intrinsic :: iso_c_binding
여기에있는 intrinsic
키워드는 올바른 모듈이 사용되고 사용자가 동일한 이름의 모듈을 사용하지 않도록합니다.
iso_c_binding
은 상호 운용 가능한 종류 유형 매개 변수에 대한 액세스를 제공합니다.
integer(c_int) :: foo ! equivalent of 'int foo' in C
real(c_float) :: bar ! equivalent of 'float bar' in C
C 유형의 매개 변수를 사용하면 C 및 Fortran 프로그램간에 데이터를 전송할 수 있습니다.
C char와 Fortran 문자의 상호 운용성은 아마도 그 자체에 대한 주제이므로 여기서는 논의하지 않습니다.
실제로 Fortran에서 C 함수를 호출하려면 먼저 인터페이스를 선언해야합니다. 이것은 본질적으로 C 함수 프로토 타입과 동일하며 컴파일러에서 인수의 수와 유형을 알 수 있습니다. bind
속성은 컴파일러에 C에서 함수 이름을 알려주는 데 사용됩니다.이 이름은 Fortran과 다를 수 있습니다 이름.
geese.h
// Count how many geese are in a given flock
int howManyGeese(int flock);
geese.f90
! Interface to C routine
interface
integer(c_int) function how_many_geese(flock_num) bind(C, 'howManyGeese')
! Interface blocks don't know about their context,
! so we need to use iso_c_binding to get c_int definition
use, intrinsic :: iso_c_binding, only : c_int
integer(c_int) :: flock_num
end function how_many_geese
end interface
Fortran 프로그램은 howManyGeese()
의 구현을 포함하는 C 라이브러리 ( 컴파일러에 따라 다름, 여기에 포함됩니까? )에 링크해야하며 how_many_geese()
는 Fortran에서 호출 할 수 있습니다.
Fortran의 C 구조체
bind
속성은 파생 된 유형에도 적용 할 수 있습니다.
geese.h
struct Goose {
int flock;
float buoyancy;
}
struct Goose goose_c;
geese.f90
use, intrinsic :: iso_c_binding, only : c_int, c_float
type, bind(C) :: goose_t
integer(c_int) :: flock
real(c_float) :: buoyancy
end type goose_t
type(goose_t) :: goose_f
이제 데이터를 goose_c
와 goose_f
사이에서 전송할 수 있습니다. Goose
유형의 인수를 사용하는 C 루틴은 유형이있는 포트란에서 호출 할 수 있습니다 type(goose_t)
.