私はdoubleをfloatに変換しようとしていますし、dll内のさまざまな整数型をGame Maker拡張機能として使用しています。ダブルがターゲットタイプの範囲に収まらない場合、私は賢明な結果を必要としないので、単にstatic_castを使用しました。C++でSIGFPEを防止/抑制するにはどうすればよいですか?
私のテストC++アプリケーションからこのコードを呼び出すと、すべてが意図した通りに動作しますが、Game Makerから呼び出されると、何らかの理由でエラーが発生し、SIGFPEが発生し、Game Makerはプログラムをエラーメッセージで終了させます。
範囲外のコンバージョンではわかりやすい結果は必要ありませんが、クラッシュはノー・ノーです。私はキャストの代わりにllroundを使用しようとしましたが、シグナルも上がります。
私はsignal(SIGFPE、SIG_IGN)を使って自分自身で信号を捕まえることも試みました。変換の直前に、それはまったく動作を変更しませんでした。おそらく、mingw signal.hの不吉なコメントには、「SIGFPEは動作していないのですか?
Game Maker拡張機能で使用されている別のdllのソースコードを確認しました。作成者が提供するバイナリは問題なく単純なキャスト変換を実行します。しかし、ソースを自分自身でコンパイルすると、SIGFPEの問題が再び発生します。私は作者が別のコンパイラを使用していたと推測していますが、可能であればmingwと一緒にいたいと思います。
これらの変換を安全に実行するか、単純なキャストで信号を実行すると信号が生成されないようにするにはどうすればよいですか?私は現在mingw-g ++ 4.5.0を使用してコンパイルしています。
ここで問題が発生した機能です:
template<typename ValueType>
static double writeIntValue(double handle, double value) {
boost::shared_ptr<Writable> writable = handles.find<Writable>(handle);
if(writable) {
// Execution reaches this point
ValueType converted = static_cast<ValueType>(value);
// Execution doesn't reach this point if e.g. ValueType
// is short and value is 40000
writable->write(reinterpret_cast<uint8_t *>(&converted), sizeof(converted));
}
return 0;
}
SIGFPEを引き起こす範囲外の変換であり、0で除算されていないことは確かですか? –
はい。私は、問題が発生した関数のコードを追加し、除算も0も存在しません。 – Medo42