【问题标题】:Calling Fortran from C++; String on return corrupted从 C++ 调用 Fortran;返回时字符串损坏
【发布时间】:2013-03-15 10:13:42
【问题描述】:

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

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

感谢您的帮助

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

在调试中: /names:小写 /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

【问题讨论】:

  • Fortran 例程在哪里调用?是openfile_func_handle吗?在那种情况下,为什么要传递 4 个参数,而 ṠN_OPENFILE˙ 只需要 3 个?
  • 在这个时代,我会使用 Fortran ISO C Binding 来混合 C/C++ 和 Fortran。这提供了一种接口语言的标准方法,而不必弄清楚特定编译器的调用约定,例如将字符串长度添加到参数列表的末尾。此类约定是不可移植的,可能会发生变化。大多数 Fortran 95 编译器都具有此功能,它是 Fortran 2003 的一部分。(即使除了想使用 ISO C 绑定之外,我也会使用 Fortran 95/2003 而不是 FORTRAN 77。) ifort 和 gfortran 手册有示例;这里也有问题。
  • 请看下面的答案。感谢您的努力。

标签: c++ string fortran


【解决方案1】:

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

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

【讨论】:

  • 另一个使用 Fortran 的 ISO C 绑定特性的理由,如 M.S.B. 所建议的那样。希望这不会有任何大的意外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 2011-09-15
  • 1970-01-01
  • 2021-09-05
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多