我正在從C++調用Fortran 77函數來傳遞文件句柄,字符串和長度。文件成功打開,並且Fortran子例程退出。但是,在C++代碼中,傳遞給fortran的字符串已損壞。當函數openFile的底部到達時,程序崩潰。從C++調用Fortran;返回字符串損壞
該崩潰只出現在版本中,但不在調試中。繪製字符串,我看到在釋放變量fileNameToFortran充滿垃圾。
感謝您的幫助
我用ifort與下面的編譯器標誌在釋放(Windows 7計算機(32位)): /名稱:小寫/ f77rtl /回溯/ IFACE:CREF /線程/遞歸/ LD
,並在調試: /名稱:小寫/ f77rtl /回溯/ IFACE:CREF /線程/遞歸/ LDD /紫/調試:全/檢查:所有/回溯
這裏是C代碼:
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);
}
這裏是Fortran代碼:
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
Fortran例程調用的地方在哪裏?它是'openfile_func_handle'嗎?在這種情況下,爲什麼喲傳遞4個參數,而'ṠN_OPENFILE'只能期望3? – 2013-03-15 12:07:30
在這個時代,我將使用Fortran ISO C Binding來混合使用C/C++和Fortran。這提供了一種接口語言的標準方式,而不必找出特定編譯器的調用約定,例如將字符串長度添加到參數列表的末尾。這些公約是不可移植的,並且可能會發生變化。大多數Fortran 95編譯器都有這個特性,這是Fortran 2003的一部分。(甚至除了想要使用ISO C綁定之外,我還會使用Fortran 95/2003而不是FORTRAN 77.)ifort和gfortran手冊中有示例;這裏也有問題。 – 2013-03-15 13:07:10
請參閱下面的答案。感謝您的努力。 – Fady 2013-03-15 15:26:15