2016-10-12 88 views
-2

我正在尝试为Fortran代码创建一个C++包装(使用MSVS2013)。包装应该从DELPHI中调用(在DELPHI 5中创建的旧代码 - 我无法触及)。 (DELPHI - > C++ dll - > fortran dll) 目标是将一些数据struct s(record在delphi中)与intdoubledouble[]从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,有符号无穷大和反常结果”。

这原来是超过编码编译器设置/标志问题的...

任何人有任何这方面的经验? (我工作的一个小的和可验证的代码块)

+0

什么是错误的是,你的代码有缺陷。除非你真的显示[mcve],否则我们看不到你的代码。要么做,要么自己做一些调试。显示虚假代码根本没有帮助。你的C++代码显然是假的。函数没有声明返回值。 –

+0

okidoki ..我在这上面:) –

+1

这是因为Delphi运行时没有屏蔽浮点异常。如果你的代码被设计成可以被屏蔽,然后掩盖它们。 –

回答

0

所以以下David Heffeman的建议......在开头添加

use ifcore 

fpe_old_flags = FOR_SET_FPE(0) 

的代码解决它。非常感谢大卫!

+0

值得注意的是,这是特定于英特尔Fortran编译器的。 –