从C ++调用Fortran;返回时的字符串已损坏

时间:2013-03-15 10:13:43

标签: c++ string fortran

我从C ++调用Fortran 77函数,它传递文件句柄,字符串和长度。文件成功打开,Fortran子例程退出。但是,回到C ++代码中,传递给fortran的字符串已损坏。当达到函数openFile的底部时,程序崩溃。

崩溃只出现在发布中,但不出现在调试中。绘制字符串,我看到在发布时变量fileNameToFortran充满了垃圾。

感谢您的帮助

我在发行版中使用带有以下编译器标志的ifort(Windows 7机器(32位)): / names:lowercase / f77rtl / traceback / iface:cref / threads / recursive / LD

并在调试中: / 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

1 个答案:

答案 0 :(得分:1)

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

宏FORTCALL定义为__STDCALL 现在,当使用iface:cref时它只会在发布时崩溃。这很奇怪,但在我删除它之后,它适用于发布和调试。