簡體   English   中英

從delphi調用c++ dll時出錯

[英]Error when calling c++ dll from delphi

我正在嘗試為某些 Fortran 代碼創建一個 C++ 包裝器(使用 MSVS2013)。 應該從 DELPHI 調用包裝器(在 DELPHI 5 中創建的舊代碼 - 我無法觸摸)。 (DELPHI -> C++ dll -> fortran dll) 目的是將一些具有intdouble以及double[]的數據struct (在 delphi 中record )從 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、有符號無窮大和非規范結果”具有相同的設置。

事實證明,這更像是一個編譯器設置/標志問題,而不是編碼……

有人對此有經驗嗎?? (我正在研究一個小而可驗證的代碼段)

所以按照David Heffeman的建議......添加

use ifcore

fpe_old_flags = FOR_SET_FPE(0)

在代碼的開頭解決了它。 非常感謝大衛!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM