수색…


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_cgoose_f 사이에서 전송할 수 있습니다. Goose 유형의 인수를 사용하는 C 루틴은 유형이있는 포트란에서 호출 할 수 있습니다 type(goose_t) .



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow