none
C++ 変数のインクリメントについて RRS feed

  • 質問

  • Microsoft Visual Studio 2005 C++でexeファイル(実行ファイル)を作成しています。
    それをデバッグしながら、テストしているのですが、時々、変数(例えばint型)をfor文で
    使用したときに、インクリメントがされません。
    また、その他の数値変数も初期化できなかったりします。

    そのコードの部分に対して何も変更してなくても、いきなり動くときもあります(これはもちろんリビルドなど行っていますが)。

    何が原因なのか、さっぱりわかりません。
    同じように宣言、使用している変数は問題なく動いています。

    2009年4月17日 7:47

回答

  • 皆さんからいろいろご意見をいただいていたのに、返信できず
    申し訳ありませんでした。

    皆さんから指摘いただいてましたが、確かにコードを書いたときの
    ミス、ありますね。恥ずかしいです。
    for文の中でのインクリメント、行っております。

    その後いろいろ試したところ、デバッガ上での表示で
    インクリメントされていないように見えているだけということがわかりました。
    表示上で見えないというのは、まぁ、もしかしたらVBC++のバグかもしれませんが
    これに頼り切るのが問題なのかもしれません。
    別の方法で値を参照(出力)するようにしたら、ちゃんと見れました。

    ご迷惑をおかけしてすみません。
    勝手ながら、一応解決として質問を閉じたいと思います。
    皆さんのご意見、ありがとうございました。

    • 回答としてマーク めいぷる 2009年4月28日 1:59
    2009年4月28日 1:59

すべての返信

  • インクリメントに失敗するという話は聞いたことがありません。
    他の変数がメモリを破壊しているのでしょうか?
    おかしくなる変数だけでなく、別の変数も確認してみてください。

    サンプルコードがあればもう少し進展すると思います。
    2009年4月17日 10:11
  • あとは、そのインクリメントされている、されていない等の挙動はどうやって確認したかも気になりますね。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年4月17日 13:59
    モデレータ
  • 返信ありがとうございます。

    そうですね、サンプルがなければわかりづらいですね。
    引用ができないため、簡単に以下に示します。

    int A()
    {

        if(aaa == 0){

            int aaacnt;
            int aaapick;

            for(aaacnt = 0; aaacnt < aaamax; aaacnt){
                 if(table[aaacnt] > 0){
                     aaapick = aaacnt;
                 // ここではテーブルの内部を参照するなどの処理を行ってます
            }

        }

        if(bbb== 0){

            int bbbcnt;
            int bbbpick;

            for(bbbcnt= 0; bbbcnt< bbbmax; bbbcnt){
                 if(table[bbbcnt].value > 0){
                     bbbpick = bbbcnt;
                    // 取得できたbbbpickを使用した処理を行います
                 }
            }

        }
        return 0;
    }

    簡単に書くと、上記のように関数内でfor文がいくつかあって、条件に合致した添え字を
    別の変数に確保して、それをさらに使う処理がメインなのですが
    最初のfor文ではエラーにならないのに、2番目のfor文ではbbbcntがインクリメントされず(デバッグで確認)
    その結果bbbpickの値も不正なものとなり、正しい処理ができません。

    使用する変数を同じものにして、関数の先頭で変数宣言しても同じこと(エラー)がおきます。

    あまりに簡単すぎるサンプルコードで、やはりわかりづらいでしょうか?

    2009年4月20日 2:14
  • インクリメントされているかどうかの確認は主にデバッガか
    もしくはDebugコマンド(?関数?)を使用して、出力ウィンドウに出力したりして
    確認しています。
    2009年4月20日 2:15
  • インクリメントしてないように見えるのですが……さすがにこれは転記ミスですよね?
    2009年4月20日 2:24

  • for(aaacnt = 0; aaacnt < aaamax; aaacnt++)

    ですよ・・・。。。
    2009年4月20日 9:09
  • for(aaacnt = 0; aaacnt < aaamax; aaacnt++)
    少し補足すると、ループ毎に3番目の文が評価されます。
    aaacnt++ であれば、それを評価することで aaacnt の値がインクリメントされます。
    aaacnt-- とか、aaacnt += 2とか、そういった式でも良いわけです。


    注:この発言はC++でコード書いている人が発言していますが、標準C++の文章に則った解説ではないので、正しい知識は書籍等を確認して下さい。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年4月20日 13:16
    モデレータ
  • はじめまして

    for(bbbcnt= 0; bbbcnt< bbbmax; bbbcnt)
    もbbbcnt++ではないでしょうか
    初歩的な指摘しかできなくて申し訳ないです。
    2009年4月20日 15:25
  • だいぶ昔ですが、++を使うとインクリメントしない場合があるというコンパイラのバグに出会ったことがあります。
    アセンブラのソースを出力して確認したところインクリメントするコードが入っていませんでした。
    ++でなく+= 1としたところ正常にインクリメントできるようになりました。
    ++を使用している箇所すべてではなくある1行だけでした。
    アセンブラがわかるならソースコード出力して確認してみたらいかがでしょうか。
    ただ、コンパイラのバグの可能性は低いと思います。
    2009年4月21日 0:06
  • 皆さんからいろいろご意見をいただいていたのに、返信できず
    申し訳ありませんでした。

    皆さんから指摘いただいてましたが、確かにコードを書いたときの
    ミス、ありますね。恥ずかしいです。
    for文の中でのインクリメント、行っております。

    その後いろいろ試したところ、デバッガ上での表示で
    インクリメントされていないように見えているだけということがわかりました。
    表示上で見えないというのは、まぁ、もしかしたらVBC++のバグかもしれませんが
    これに頼り切るのが問題なのかもしれません。
    別の方法で値を参照(出力)するようにしたら、ちゃんと見れました。

    ご迷惑をおかけしてすみません。
    勝手ながら、一応解決として質問を閉じたいと思います。
    皆さんのご意見、ありがとうございました。

    • 回答としてマーク めいぷる 2009年4月28日 1:59
    2009年4月28日 1:59