2010-03-22 3 views
4

필자가 작성한 몇 가지 C++ 함수를 호출하는 FORTRAN 코드를 얻으려고합니다 (그 중 하나 인 c_tabs_). 클래스에 속하지 않는 함수를 호출하는 한 링크 및 모든 것이 잘 작동합니다.Fortran을 사용하여 C++ 함수 호출

제 문제는 FORTRAN 코드를 호출하여 클래스에 속하게하려는 기능입니다. 내가 사용하는 심볼 테이블 보았다 nm의 함수 이름이 같은 추한 뭔가 :

00000000 T _ZN9Interface7c_tabs_Ev 
FORTRAN 나 때문에 시작 부분에 밑줄로, 그 이름으로 함수를 호출 할 수 없습니다, 그래서 나는 '

난 손실.

는 클래스에없는 c_tabs에 대한 기호는 매우 간단하고, FORTRAN은 아무런 문제가 없습니다 :

00000030 T c_tabs_ 

어떤 제안? 미리 감사드립니다.

답변

3

C++ 루틴을 C 스타일 인터페이스 (이미 설명한대로)로 만들면 다음과 같은 ISO C 바인딩 기능을 사용할 수 있습니다. Fortran 2003에서 호출합니다. ISO C 바인딩을 사용하면 루틴의 이름과 인수 및 함수 반환의 C 유형 및 호출 규칙 (참조, 값순)을 (제한 내에서) 지정할 수 있습니다. 이 방법은 잘 작동하며 Fortran에서 C를 호출하는 이전 방법과 달리 컴파일러 및 플랫폼에 따라 다르므로 표준이되는 이점이 있습니다. ISO C 바인딩은 gfortran> = 4.3과 같은 많은 Fortran 95 컴파일러에서 지원됩니다.

+0

+1 다소 복잡하고 연약한 매우 직설적이며 견고한 ISO C 바인딩의 사용을 제안했습니다. –

+0

완벽! 이것은 내가 찾고 있었던 바로 그 것이다. 나는 Sente의 Die와 같은 C 인터페이스를 만드는 방법을 자신의 대답에서 제안하고 놀았지만 고통 스럽다. 감사합니다. –

4

C 스타일 인터페이스를 만들어 "extern"해야합니다. C++은 링크를 위해 메서드 이름 (및 오버로드 된 함수)을 조작합니다. C++과 C++을 제외한 모든 것을 링크하는 것은 아주 어렵습니다. "방법"이 있지만 간단히 C 인터페이스를 내보내고 Fortran에서 사용할 수있는 표준 기능을 사용하는 것이 좋습니다.

7

이름이 잘못되었으므로 C++ 컴파일러는 함수 오버로드 및 유형 안전 링과 같은 것을 허용하는 기능을합니다. 솔직히, FORTRAN에서 멤버 함수를 호출 할 가능성은 거의 없습니다 (FORTRAN은 C++ 클래스 인스턴스를 만들 수 없기 때문에). C API와 관련하여 인터페이스를 표현해야합니다. C API는 어느 곳에서나 호출 할 수 있습니다.

3

FORTRAN을 C++로 호출하는 모든 세부 사항을 다루기 위해서는 extern "C" 래퍼를 만들어야합니다. 이름 변환이 가장 명백합니다. FORTRAN 컴파일러는 결코 값으로, 참조로 모든 인수를 전달하는 것이

class foo { 
public: 
    int a_method (int x); 
} 

extern "C" int foo_a (foo * pfoo, int * px) { 
    if (NULL == pfoo) 
     return 0; 
    else 
     return pfoo->a_method (*px); 
} 

알 수 있습니다. (비록 이것이 엄격하게 FORTRAN 표준의 일부라고 말하지는 않지만).

+0

어디에서 foo 포인터를 가져올 것입니까? –

+0

pfoo를 void *로 만들면 foo 객체 'extern "C"void * foo_create()를 만드는 메서드가 필요합니다! –

+0

이미 존재하는 foo 객체에 대한 포인터를 얻는 방법은 무엇입니까? –