从delphi

时间:2016-10-12 10:12:44

标签: c++ delphi dll fortran

我正在尝试使用create c ++包装器(使用MSVS2013)来创建一些fortran代码。应该从DELPHI调用包装器(在DELPHI 5中创建的旧代码 - 我无法触摸)。 (DELPHI - > C ++ dll - > fortran dll) 目的是将structrecord以及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,签名无穷大和非正规结果”。

这比编码......更多的是编译器设置/标志问题。

任何人都有这方面的经验吗? (我正在研究一个小的,可验证的代码片段)

1 个答案:

答案 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

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