16

VS 2012 で最も奇妙な動作に遭遇しました (cpp で書いています)。

変数で「ウォッチを追加」をクリックすると、「識別子が未定義です」と表示されます。

コードの例を次に示します。

for (int j=0;j<32;j++)
        {
            unsigned char curValue=desc1.at<unsigned char>(0,j);
            printf("%s\n",curValue);    
        }

curValue の値を表示するには、printf を使用する必要がありました。笑。

誰かがそのような行動に遭遇しましたか?

編集:これはもっと奇妙です。次のコードをデバッグする場合:

    int b1[8];

    for (int k=0;k<7;k++)
        b1[k]=0;

    char q=curValue; 
    int t=0;
    while (q!=0){
        b1[t++]=q%2;
        q=q/2;
    }

デバッガーは、b1[k]=0; のループをスキップするだけです。

ループ内でも curValue は定義されていないことに注意してください。

ありがとう!

4

7 に答える 7

24

Joachim が言ったように: curValue はループ内で定義されます。Visual Studio のウォッチ ウィンドウで未定義の値が表示される場合は、コンパイラの最適化をオフにする必要があります。

コンパイラ最適化のデフォルトは /O2 速度の最適化です。オフにするには:

  • プロジェクトに移動し、右クリックしてプロパティを選択します
  • 構成プロパティ -> C/C++ -> 最適化
  • 最適化を選択し、最大速度 (/O2) から無効 (/Od) に変更します。 ここに画像の説明を入力
于 2014-02-03T10:54:49.737 に答える
4

最適化をオンにしました。それは私のデバッグを台無しにしました。

于 2013-07-27T18:21:16.053 に答える
2

printf がないと、最初のループに副作用がないため、最適化されたビルドで最適化されてしまう可能性があります。2 番目の例では、小さな配列を 0 に初期化するループが、おそらく初期化されたデータ セクションに置き換えられます。

おそらく、最適化されていないビルドでデバッグを試みる必要があります。

また、Visual Studio デバッガーには、標準コンテナー用の非常に優れたビジュアライザーがあることにも注意してください。したがって、最初のループの全体の目的が の内容をのぞくだけであるdesc1場合は、おそらくデバッガで直接調べることができます。

于 2013-07-27T22:45:57.757 に答える
1

変数curValueはループ内でのみ有効であることに注意してください。ループ内にないときにウォッチに追加しようとすると、変数は定義されません。

于 2013-07-27T17:55:18.090 に答える
1

ループcurValue外で範囲外になるからです。for

また、印刷には%cinを使用する必要があることに注意してください。C スタイルの文字列に使用されます。printfchar%s

printf("%c\n",curValue);
于 2013-07-27T17:56:58.060 に答える
1

変数curValueはループ内でのみ有効です。ループに入っていないときに「ウォッチ」に追加しようとすると、変数は定義されません。

注:これを印刷することをお勧めします:

printf("%c\n",curValue);

これの代わりに:

printf("%s\n",curValue)
于 2013-07-27T17:58:15.517 に答える