2011-01-12 7 views
0

私はこれまでにこれに遭遇したことはなく、それは心を揺さぶって、非論理的です。やや複雑なループがあり、printfステートメントをいくつか入れてすべてが動作しているかどうか試してみたいと思っています。私はprintfを使って中間製品を探し、答えがOKであることを確認します。次に、中間製品にprintfをコメントアウトすると、答えは間違っています。誰もこれに遭遇しましたか?これは私を狂ってしまい、printfsが答えをどのように変えてしまうのかわかりません.... X_x助けがあれば、私はDSP用にc/C++コンパイラを使っています。何かアドバイスをありがとう。..ここprintfsを利用しようとすると、不思議なデバッグの問題が発生する

スニペットがある...

printf("splitBackground = %d, numWindowPoints = %d\n", splitBackground, numWindowPoints); 
splitBackground = splitBackground/numWindowPoints; 
printf("%d ", splitBackground); 

これは良いですが、私は、コードの最初の行をコメントアウトするとき、それは非常正しくないことが判明。 :(

+5

コードを表示してください! – William

+1

明らかに、あなたのコードで何らかの未定義の動作が起こっていると思います。 –

+0

スニペットを追加しました。 –

答えて

7

ほとんどの場合、あなたのコードでは未定義の動作が起こる可能性があります。 ined "は、"それはある状況下ではうまくいくかもしれない "ことを意味する。

なぜprintfを挿入すると問題なく動作しますか?いくつかの可能性:

プログラムの異なる部分間、またはプログラムと他の世界との間のタイミング関係を変更します。

printf呼び出しは、それ以外の場合に起こるコンパイラの最適化を禁止します。

printf呼び出しは、バグの発生を防ぐ方法で標準ライブラリの内部状態を変更します。

printf呼び出しは、バグの発生を防ぐ方法でハードウェアとやりとりします。

は(デバッガの下で実行されているときに、同じ考慮事項の多くはまた真であることに注意してください - このように、用語「特異なバグ」:あなたはそれを見ていないときにのみ発生したバグを。)

1

個人的に私は、標準出力、標準エラー出力にない印刷でしょう。

あなたは私はあなたの問題を解決しようとするデバッガを最大限に活用するだろうIDEを使用している場合。同様に2010 Visual Studioで、EclipseやNetbeansを使用して、ブレークポイントを追加し、コード行を徐々に進めてください。

0

printfの副作用があります(正しい結果につながるデータを修正してください)。問題のあるコード

0

おそらく、これはスタックの破損であり、あなたのprintfは何とかスタックを拡張したりガードページなどをトリガーします。しかし、コードの残りの部分がないと何も言い難いです。

関連する問題