• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:printfの有無で値が変化する)

printfを用いたプログラムで値が変わる問題の解消方法

このQ&Aのポイント
  • プログラム中のprintf文の位置によってttimeの値が変わり、予期しない結果が生じています。
  • printf文を挿入しないでプログラムを実行すると値が変わらないため、printf文の位置に問題があることがわかります。
  • プログラムの実行結果を確認するためには、printf文ではなくデバッガを使用する方が適切です。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

既に回答のあるように、メモリーリークが発生しているのだとは思いますが、その原因は省略されたところにあります。 よって、これだけではどこを治せばよいかは言えません。 あとは、プログラム構成がよくないので、間違いを見付けにくい、というのがあるかもしれません。 もし、 ここにあるのがプログラムの全体だとしたら、 1万行近い main関数なんて考えたくありません。 定数として使っている(と思われる) ttime,DCYCLはともかく、ループカウンタのtや,なにかの計算をするCYCLまでグローバル変数にしてしまっているのも、最近の書き方ではありません。 戻り値も引数も省略した main(){...}という書き方は、現在では使いません。 > main(){ > while(CYCL<=DCYCL){ 実際にこの間になにも記述が無いのなら、CYCLの初期化がありません。 グローバル変数にしたことで、たまたま0になっていますが、それを期待して明示的に初期化しないのは思わぬバグの元になります。 明示的に初期化するようにしましょう。

kumakuman3
質問者

お礼

お礼が遅くなりました。 無事解決いたしました。 変数を定義していない個所に 代入をしようとしたため、エラーだったようです。 ありがとうございます。

その他の回答 (2)

回答No.2

メモリ破壊のパターンです。 printfを入れたことにより変数等のメモリ配置が変わったために正しく動作するように見えるだけです。 検出されたのがこの変数であり、他にもある可能性があります。メモリ転送関係(ポインタ等)の全面的な見直しが必要と考えます。 このようなケースではコンパイルオプションの変更でも発現することがあります。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

配列確保領域以外の書き換えやポインタのアドレス(オフセット)計算の間違いなどで ttimeの領域を壊しているのかも知れないですね とりあえず ttimeを初回の代入だけで済むなら const int ttime = 2000; などと 定数扱いにしてしまうとかでしょうか ・・・