簡體   English   中英

從C ++調用Fortran; 返回時的字符串已損壞

[英]Calling Fortran from C++; String on return corrupted

我從C ++調用Fortran 77函數,它傳遞文件句柄,字符串和長度。 文件成功打開,Fortran子例程退出。 但是,回到C ++代碼中,傳遞給fortran的字符串已損壞。 當達到函數openFile的底部時,程序崩潰。

崩潰只出現在發布中,但不出現在調試中。 繪制字符串,我看到在發布時變量fileNameToFortran充滿了垃圾。

謝謝你的幫助

我在發行版中使用ifort和以下編譯器標志(Windows 7機器(32位)):/ names:lowercase / f77rtl / traceback / iface:cref / threads / recursive / LD

並在debug中:/ names:lowercase / f77rtl / traceback / iface:cref / threads / recursive / LDd / Zi / debug:full / check:all / traceback


這是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

好的,我自己找到了答案。

宏FORTCALL被定義為__STDCALL現在,當使用iface:cref時它只會在發布時崩潰。 這很奇怪,但在我刪除之后,它適用於發布和調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM