加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:03:48 所属栏目:百科 来源:网络整理
导读:我从C调用Fortran 77函数传递文件句柄,字符串和长度.文件成功打开,Fortran子例程退出.但是,回到C代码中,传递给fortran的字符串已损坏.当达到函数openFile的底部时,程序崩溃. 崩溃只出现在发布中,但不出现在调试中.绘制字符串,我看到在发布时变量fileNameToFo
我从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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读