我正在尝试使用create c ++包装器(使用MSVS2013)来创建一些fortran代码。应该从DELPHI调用包装器(在DELPHI 5中创建的旧代码 - 我无法触摸)。 (DELPHI - > C ++ dll - > fortran dll)
目的是将struct
和record
以及int
的一些数据double
s(delphi中的double[]
)从delphi传递到fortran进行计算。
c ++ dll - > fortran没问题 - 我已经测试了另一个c ++可执行文件。有用。问题是当delphi调用c ++和c ++调用fortran时。然后我收到一个错误
项目“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,签名无穷大和非正规结果”。
这比编码......更多的是编译器设置/标志问题。
任何人都有这方面的经验吗? (我正在研究一个小的,可验证的代码片段)
答案 0 :(得分:0)
按照David Heffeman的建议......添加
$(document).ready(function () {
//attaching the event listener
$(window).on('hashchange', function () {
//do something
});
//manually tiggering it if we have hash part in URL
if (window.location.hash) {
$(window).trigger('hashchange')
}
});
和
use ifcore
在代码的开头解决了它。非常感谢大卫!