いくつかの複雑な数値計算に既存のパッケージを使用しています。私がする必要があるのは、「損失」と呼ばれる関数をカスタマイズすることです。「損失」関数のデフォルトの動作は、予想される最終的な計算結果につながります。しかし、私のカスタマイズでは期待した結果が得られません。だから私はそれをデバッグしようとしています。
(1) 他の関数によって呼び出される関数 int loss(int c1, int c2) をカスタマイズしています。最初に、デフォルトの動作は c1==c2 を返すだけであることに注意してください。0:4; 私はそれを次のように変更したい:
double loss(int c1, int c2) {
int v1 = map[c1]; // map is an int array
int v2 = map[c2];
return doSomething(v1, v2);
}
プログラムは「損失」関数を使用して、いくつかの連続した複雑な数値計算を行いますが、最終的な計算結果は期待どおりではありません。したがって、「損失」機能をデバッグして、正しく機能することを確認したいと思います。
(2) 次のように簡単にします。
double loss(int c1, int c2) {
int v1 = map[c1];
int v2 = map[c2];
[1]. return v1==v2 ? 0: 4; // this should be equivalent to [4] in my application
// double check that different position of the array have different values
[2]. if( (c1==c2 && v1!=v2) || (c1!=c2 && v1==v2)) {
[3]. exit(0); // printf("%d %d %d %d", v1, v2, c1, c2);
}
[4]. return c1==c2 ? 0: 4;
}
他のステートメントなしで [4] のみを使用する場合、それがデフォルトの動作であり、期待される計算結果につながることがテストされていることに注意してください。
ここで最初に [1] を使用しますが、[2] を [4] にコメントします。これは、アプリケーションの [4] と同等です。つまり、配列「マップ」に重複する要素がないことを期待しています。[1]<=>[4]、私は [4] をテストしたので、最終的な計算は正しいので、これは正しい最終的な計算結果にはつながりません。これは奇妙です。
[2] と [3] を追加して (もちろん [1] を削除して)、[1] と [4] が同等であることを再確認したいと思います。プログラムは最後まで実行されます。つまり、[3] は実行されないため、[1] と [4] が同等であることが保証されます。ただし、[2] と [3] を追加して c1 と c2 の値を変更していませんが、最終的な計算は期待どおりではありません。[3] で printf を使用すると、同様の問題が発生します。しかし、一部のステートメントでは問題が発生しません。たとえば、「if」本体では、「int a = c1 + c2;」を使用するだけで、結果は正しいです。
さらに奇妙なことに、[3] をコメントして (つまり、if 本体は何もしない)、[2] と [4] の両方を使用すると、最終的な計算は期待どおりになります!
奇妙な問題を理解するのを手伝ってくれませんか?
ありがとう、ジェフ