2016-10-12 21 views
-2

一部のFortranコードでC++ラッパー(MSVS2013を使用)を作成しようとしています。ラッパーはDELPHI(DELPHI 5で作成された古いコード - 私は触れることができません)から呼び出されるはずです。 (デルファイ - > C++のdll - > fortran dll) とdoubledouble[]の数値を持つデータstruct(デルファイではrecord)が計算のためにデルファイからfortranに渡されるということです。 C++のdll - > fortranは問題ありません - 別のC++実行可能ファイルでテストしました。できます。問題は、delphiがC++とC++の呼び出しでfortranを呼び出すときです。次に、エラーが発生するデルファイからC++ DLLを呼び出すときにエラーが発生する

プロジェクト "myDelphiProject.exe"例外クラスEZeroDivideに 'ゼロによる浮動小数点除算'が発生しました。

fortranへの呼び出しが行われない場合は、C++ラッパーの呼び出しは問題ありません。 私はすべての変数がdelphiとC++の間を通過することをテストし、確認しました。呼び出し規約はcdeclに設定されています。

簡易コード: デルファイ

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動作しません。

誰に間違っているか考えてもらえますか?


EDIT: OK ..ので、私はそれを絞り込むために管理している: Iは、与えられた入力に正しい内部結果である無限大になるゼロによる除算を(持っている - これはから直接出力されませんfortran dll)。 これは、Fortran dllがデフォルトのリリース設定を使用してコンパイルされている場合、C++では呼び出されてもdelphiでは呼び出されません。 しかし、C++とDelphiの両方でデバッグ設定を使用すると機能します。 私は検証のためにテキストファイルに変数を出力します.4つのすべてのケースで、除数は0で、うまくいく3つのケースでは結果は 'inf'です。デバッグモードとリリースモードの両方で、私は浮動小数点例外処理 "NaNの生成、符号なし無限大、デノーマル結果"の設定が同じです。

これは、コーディングよりも、コンパイラの設定/フラグの問題よりであることが判明...

誰もがこれでの経験を持っています? (Iが小さく、検証可能なコード片に働いています)

+0

何が問題なのは、コードに欠陥があることです。実際に[mcve]を表示しない限り、コードは表示されません。どちらかを行うか、自分でデバッグしてください。偽のコードを表示することはまったく役に立ちません。あなたのC++コードは明らかに偽です。関数には戻り値が宣言されていません。 –

+0

okidoki ..私はそれにあります:) –

+1

これは、Delphiランタイムが浮動小数点例外をマスク解除するためです。コードがマスクされた状態で動作するように設計されている場合は、それらのマスクをマスクします。 –

答えて

0

のでDavid Heffemanのアドバイスを次...コードの先頭に

use ifcore 

fpe_old_flags = FOR_SET_FPE(0) 

を追加し、それを解決。ダビッドありがとう!

+0

これは、インテルFortranコンパイラに固有のものです。 –

関連する問題