我正在尝试为Fortran代码创建一个C++包装(使用MSVS2013)。包装应该从DELPHI中调用(在DELPHI 5中创建的旧代码 - 我无法触及)。 (DELPHI - > C++ dll - > fortran dll) 目标是将一些数据struct
s(record
在delphi中)与int
和double
和double[]
从delphi传递到fortran进行计算。 C++ dll - > fortran是没有问题的 - 我用另一个C++可执行文件测试过。有用。问题是当delphi调用C++和C++调用fortran时。然后我得到一个错误,说从delphi调用C++ dll时出错
项目“myDelphiProject.exe”引发异常类EZeroDivide消息'浮点除零'。
如果没有发生对fortran的调用,调用C++ wrapper就没有问题。 我已经测试并确认所有变量都通过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不起作用。
有没有人有任何错误的想法?
编辑: OK ..所以我设法缩小范围: 我由零导致无穷大(这是一个正确的内部结果与给定的输入有师 - 这是不是直接输出fortran dll)。 当使用默认版本设置编译fortran dll时,这被用C++调用,但不是从delphi调用。 然而,它在使用调试设置时,在C++和delphi中都有效。 我输出变量到一个文本文件(在划分之前和之后)以进行验证,并且在所有4种情况下,除数为0,并且在三种情况都很好的情况下结果为'inf'。无论是在调试模式还是释放模式下,我都拥有相同的浮点异常处理设置“生成NaN,有符号无穷大和反常结果”。
这原来是超过编码编译器设置/标志问题的...
任何人有任何这方面的经验? (我工作的一个小的和可验证的代码块)
什么是错误的是,你的代码有缺陷。除非你真的显示[mcve],否则我们看不到你的代码。要么做,要么自己做一些调试。显示虚假代码根本没有帮助。你的C++代码显然是假的。函数没有声明返回值。 –
okidoki ..我在这上面:) –
这是因为Delphi运行时没有屏蔽浮点异常。如果你的代码被设计成可以被屏蔽,然后掩盖它们。 –