从Delphi调用C ++ DLL时出错

埃里克·塞塞尔(Erik Thysell)

我正在尝试为某些fortran代码使用创建c ++包装器(使用MSVS2013)。该包装程序应该从DELPHI(在DELPHI 5中创建的旧代码-我无法触摸)中调用。(DELPHI-> C ++ dll-> fortran dll)的目的是将某些带有s和s的数据structrecord在delphi中)从delphi传递到fortran进行计算。C ++ dll-> fortran没问题-我已经用另一个C ++可执行文件进行了测试。有用。问题是,当delphi调用c ++且c ++调用fortran时。然后我得到一个错误,说intdoubledouble[]

项目“ myDelphiProject.exe”引发了异常类EZeroDivide,消息为“浮点除以零”。

如果未发生对fortran的调用,则调用c ++包装器没有问题。我已经测试并确认所有变量都在delphi和c ++之间通过。呼叫约定设置为cdecl

简化代码:Delphi

interface
rec1 = record
  var1,var2: double;
  end;
procedure myCppWrap(record1: myrecord); cdecl; external 'mycppwrap.dll' name '_myCppWrap'
implementation
procedure MyDelphiFunc();
var
 ...
begin
 myCppWrap(rec1)
 ...

简化的C ++代码:

struct rec1
{
  double var1,var2;
}
extern "C" __declspec(dllexport) __cdecl myCppWrap(rec1 r1);
extern "C" *myFortranSub(double *varF1,double *varF2);

简而言之:DELPHI-> C ++可以工作,C ++-> Fortran可以工作,DELPHI-> C ++-> Fortran不能工作。

有谁知道出什么问题了吗?


编辑:好的..所以我设法缩小范围:我除以零会导致无穷大(这是给定输入的正确内部结果-这不是来自fortran dll的直接输出)。当使用默认发行版设置编译fortran dll时,用c ++调用,但不能用delphi调用,这很好。但是,在c ++和delphi中都使用调试设置时,它确实可以工作。我将变量输出到文本文件(除法前后)进行验证,在所有4种情况下,除数均为0,在三种情况下结果均为'inf'。在调试和发布模式下,浮点异常处理都具有相同的设置“产生NaN,有符号的无穷大和异常结果”。

事实证明,这比编码更像是编译器设置/标志问题。

有人对此有经验吗??(我正在研究一个小的且可验证的代码段)

埃里克·塞塞尔(Erik Thysell)

因此,按照David Heffeman的建议...

use ifcore

fpe_old_flags = FOR_SET_FPE(0)

在代码的开头解决了它。非常感谢David!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章