2013-03-15 27 views
4

我正在從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 
+0

Fortran例程調用的地方在哪裏?它是'openfile_func_handle'嗎?在這種情況下,爲什麼喲傳遞4個參數,而'ṠN_OPENFILE'只能期望3? – 2013-03-15 12:07:30

+4

在這個時代,我將使用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

+0

請參閱下面的答案。感謝您的努力。 – Fady 2013-03-15 15:26:15

回答

1

OK,我發現自己的答案。

宏FORTCALL被定義爲__STDCALL 現在,當使用iface:cref時,它只會在發佈時崩潰。這很奇怪,但是在我刪除它之後,它可以用於發佈和調試。

+1

另一個理由是使用M.S.B建議的Fortran的ISO C綁定特性。這應該有希望沒有任何大驚喜的工作。 – 2013-03-16 06:36:10