파일 핸들, 문자열 및 길이를 전달하는 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
포트란 루틴이 어디에서 호출 되었습니까? 그것은'openfile_func_handle'입니까? 이 경우, 왜 4 개의 인자를 넘기는 반면,''N_OPENFILE''은 3을 기대하고있는 것일까 요? –
이 시대에는 C/C++과 Fortran을 혼합하기 위해 Fortran ISO C 바인딩을 사용했습니다. 이것은 인수 목록의 끝에 문자열 길이를 추가하는 것과 같이 특정 컴파일러의 호출 규칙을 알아내는 대신 언어를 인터페이스하는 표준 방법을 제공합니다. 이러한 규칙은 휴대 할 수 없으며 변경 될 수 있습니다. 대부분의 Fortran 95 컴파일러는 Fortran 2003의 일부인이 기능을 가지고 있습니다. (심지어 ISO C 바인딩을 사용하고 싶을뿐 아니라 FORTRAN 77 대신 Fortran 95/2003을 사용합니다.) ifort 및 gfortran 설명서에는 예제가 있습니다. 또한 여기에 질문. –
아래 답변을 참조하십시오. 노력에 감사드립니다. – Fady