C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了从C调用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
@H_301_32@解决方法
好的,我自己找到了答案.

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

大佬总结

以上是大佬教程为你收集整理的从C调用Fortran;返回时的字符串已损坏全部内容,希望文章能够帮你解决从C调用Fortran;返回时的字符串已损坏所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。