我正在尝试为某些fortran代码使用创建c ++包装器(使用MSVS2013)。该包装程序应该从DELPHI(在DELPHI 5中创建的旧代码-我无法触摸)中调用。(DELPHI-> C ++ dll-> fortran dll)的目的是将某些带有s和s的数据struct
(record
在delphi中)从delphi传递到fortran进行计算。C ++ dll-> fortran没问题-我已经用另一个C ++可执行文件进行了测试。有用。问题是,当delphi调用c ++且c ++调用fortran时。然后我得到一个错误,说int
double
double[]
项目“ 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,有符号的无穷大和异常结果”。
事实证明,这比编码更像是编译器设置/标志问题。
有人对此有经验吗??(我正在研究一个小的且可验证的代码段)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句