17

私は予期しない行動を経験しており、調査の焦点となる領域について誰かがガイダンスを手伝ってくれることを望んでいました。

2つのメソッドがあります。1つは基本的にdoubleでゼロ除算テストを実行し、もう1つはexternアンマネージdllのメソッドを呼び出します。

注: .Netランタイムでは、DoubleをZeroで除算すると、Infinity値が返されます(おもしろいことに、正または負のフレーバーのいずれか)。

私が行っていることの擬似コードは次のようになります。

InfinityTest(); // Returns an Infinity value as expected
DllCall();
InfinityTest(); // Divide by zero error on second call.

の最初の呼び出しInfinityTest()は、期待どおりに値Infinityを返します。の2番目の呼び出しInfinityTest()は、予期していなかったゼロ除算例外をスローします。

アップデート

以下の効果的なInfinityTest()コード。簡潔にするために、try / catch要素などを削除しました。疑似コード要素の詳細に入る権限がありませんDllCall()、お詫びします。

private double InfinityTest()
{
    double a = 1.0;
    int b = 0;
    return a / b;
}
4

1 に答える 1

13

DLLがFPステータスワードを変更しているように聞こえるので、それを元に戻すしか選択肢がない場合があります。P /Invoketo_clearfpまたはをお勧めし_fpresetます。P/Invokeの署名は次のとおりです。

    [DllImport("msvcrt.dll")]
    static extern UInt32 _clearfp();
    [DllImport("msvcrt.dll")]
    static extern void _fpreset();

これは、物事を元の状態に正確にリセットしない可能性がありますが、うまくいけば、十分に近くなります。

于 2011-04-19T16:52:36.067 に答える