2010-12-08 6 views
3

C 함수를 통해 Fortran 함수를 호출하는 것에 대해 도움을 요청하고 싶습니다. 이 C 함수는 파이썬 코드에서 cython을 통해 사용됩니다. 모든 것을 정리하면 다음과 같은 체계가 있습니다.Cython, C 및 Fortran

Cython 모듈 -> C 함수 -> 포트란 -> "호출"을 의미합니다.

현재 cython에서 C 함수를 호출 할 수 있지만 fortran 함수를 호출하는 데 어려움을 겪고 있습니다. 도와 주실 수 있습니까? (간단한 예가 좋을 것입니다).

미리 감사드립니다. 편집 : gcc 4.1.2를 사용 중입니다. 그리고 gfortran

+0

좀 더 정확한 대답은 아마 당신이 요구하는 특정 C 컴파일러와 포트란 컴파일러를 알아야 할 것입니다. – SingleNegationElimination

+0

수정 됨. 죄송합니다 깜빡 : – nunolourenco

+0

[fwrap] (https://github.com/kwmsmith/fwrap)을 알고 있습니까? – ephemient

답변

7

첫 번째 대답의 링크는 구식 방법을 설명합니다. Fortran을 C에서 호출하거나 C에서 Fortran으로 호출하는 것이 훨씬 쉬워졌습니다. ISO C 바인딩을 Fortran에 추가하는 것입니다. 이 포트란 언어 기능을 사용하면 Fortran 컴파일러가 C와 이진 호환되는 실행 가능 코드를 방출하도록 지시합니다. 프로그래머는 연결을 "해킹"할 필요가 없으며 컴파일러와 플랫폼에 독립적이기 때문에 언어의 일부이기 때문입니다. 기술적으로 ISO C 바인딩은 Fortran 2003의 일부이지만 여러 컴파일러에서 사용할 수 있습니다 (예 : gfortran 버전 4.3 이상 및 Intel ifort).

C에서 Fortran 서브 루틴이나 함수를 호출하려면 바인드 C 옵션을 사용하여 Fortran 서브 루틴이나 함수를 선언하고 바인드에서 인수 선언을 제공하는 C 호환 유형을 사용하십시오. gfortran 매뉴얼에는 "혼합 언어 프로그래밍"예제가 있습니다. ISO C 바인딩은 언어의 일부이므로,이 섹션은 주로 컴파일러에 독립적입니다. 스택 오버플로 및 웹의 다른 곳에서 이전 답변에 다른 예제가 있습니다. 이 사건 -

subroutine test (varint1, varflt2) bind (C, name="MyTest") 

    use iso_c_binding 

    integer (kind=c_int32_t), intent (in) :: varint1 
    real (kind=c_float), intent (out) :: varflt2 

바인드 C 이름이 "MYTEST"는 포트란 이름을 오버라이드 : 여기

는 C에서 호출되는 서브 루틴의 포트란 서브 루틴 선언 짧은 코드 단편 (안된) 인 민감한, 포트란과는 다릅니다. 밑줄에 대해 걱정할 필요가 없습니다! 변수 유형은 분명해야합니다 ... gfortran 매뉴얼이나 다른 곳에서 사용 가능한 것을 찾으십시오.

+0

흠, 나는 블랙 박스로 주어 졌으므로 포트란 코드를 수정하지 않고도 할 수 있다고 생각했습니다. 난 그냥 당신의 통찰력 덕분에, 그것을 많이하고, 감사의 방법을 많이 관리 :) – nunolourenco

0

많은 구글 히트 (C에서 Fortran 호출). try http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html

나는 Macro-10에서 Fortran-IV를 호출하기 위해 35 년 전에 사용해 왔지만 최근 공유 할 경험이 없습니다.

+0

나는 이것을 이미 시도했다. 작동하지 않았습니까? ( – nunolourenco

+2

자세한 정보가 필요합니다. 정확히 무엇을 시도 했습니까? 정확히 어떻게 실패 했습니까? –

1

Fortran 루틴에 C, cython 및 python 바인딩을 생성하는 fwrap이라는 자동 도구가 있습니다. 아직 베타 상태라고 생각하지만 도움이 될 것입니다. 링크는 here입니다.