2013-03-15 2 views
4

파일 핸들, 문자열 및 길이를 전달하는 C++에서 Fortran 77 함수를 호출합니다. 파일이 성공적으로 열리고 Fortran 서브 루틴이 종료됩니다. 그러나 C++ 코드에서 Fortran에 전달 된 문자열이 손상되었습니다. 함수 openFile의 맨 아래에 도달하면 프로그램이 충돌합니다.C++에서 Fortran 호출하기. 반환 할 문자열이 손상되었습니다.

크래시는 릴리스에만 표시되고 디버그에는 표시되지 않습니다. 문자열을 그려 보면, 릴리스에서 변수 fileNameToFortran이 휴지통으로 가득 차 있다는 것을 알 수 있습니다. 당신의 도움에 대한

덕분에

나는 (윈도우 7 컴퓨터를 (32 비트)) 릴리스에서 컴파일러 플래그를 다음과 같이 ifort를 사용 /이름 : 소문자/f77rtl/추적/IFACE : CREF/스레드/순환/LD를

및 디버그

: /이름 : 소문자/f77rtl/추적/IFACE : CREF/스레드/순환/LDD/닫아/디버그 : 전체/검사 : 모든/역 추적 여기


는 C이다 코드 :

012 3,516,
typedef void (FORTCALL *sn_openfile_func) (int *, 
              char[], 
              int *, 
              int); 
void openFile(const int fileHandle, const std::string fileName) 
{ 
    int fileHandleToFortran = fileHandle; 
    char fileNameToFortran[20]; 
    assert(fileName.size() < 20); 

    strcpy(fileNameToFortran, fileName.c_str()); 
    int lstr = strlen(fileNameToFortran); 
    openfile_func_handle(&fileHandleToFortran, fileNameToFortran, &lstr, lstr); 
} 

여기 포트란 코드입니다 :

 SUBROUTINE SN_OPENFILE(FILENR,FILENAME,FSIZE) 
     !DEC$ ATTRIBUTES DLLEXPORT :: SN_OPENFILE 
     IMPLICIT NONE 
     INTEGER FILENR, FSIZE 
     CHARACTER FILENAME*FSIZE 
     OPEN (FILENR,FILE = FILENAME, 
    &  ACCESS = 'SEQUENTIAL' , STATUS = 'REPLACE', ERR=222) 
     GOTO 333 
222 WRITE(*,*) 'Error opening file' 
333 END 
+0

포트란 루틴이 어디에서 호출 되었습니까? 그것은'openfile_func_handle'입니까? 이 경우, 왜 4 개의 인자를 넘기는 반면,''N_OPENFILE''은 3을 기대하고있는 것일까 요? –

+4

이 시대에는 C/C++과 Fortran을 혼합하기 위해 Fortran ISO C 바인딩을 사용했습니다. 이것은 인수 목록의 끝에 문자열 길이를 추가하는 것과 같이 특정 컴파일러의 호출 규칙을 알아내는 대신 언어를 인터페이스하는 표준 방법을 제공합니다. 이러한 규칙은 휴대 할 수 없으며 변경 될 수 있습니다. 대부분의 Fortran 95 컴파일러는 Fortran 2003의 일부인이 기능을 가지고 있습니다. (심지어 ISO C 바인딩을 사용하고 싶을뿐 아니라 FORTRAN 77 대신 Fortran 95/2003을 사용합니다.) ifort 및 gfortran 설명서에는 예제가 있습니다. 또한 여기에 질문. –

+0

아래 답변을 참조하십시오. 노력에 감사드립니다. – Fady

답변

1

OK, 나는 대답 나 자신을 발견했다.

매크로 FORTCALL은 __STDCALL 으로 정의되었습니다. 이제 iface : cref를 사용할 때 릴리스에서만 충돌합니다. 이상하지만, 제거한 후에는 릴리스 및 디버그를 위해 작동합니다.

+1

M.S.B가 제안한 포트란의 ISO C 바인딩 기능을 사용하는 또 하나의 이유. 그것은 큰 놀라움없이 잘 작동 할 것입니다. –

관련 문제