web-dev-qa-db-ja.com

時計を追加すると、未定義の識別子が表示されますVisual Studio 2012、cpp

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はループ内でも未定義であることに注意してください。

ありがとう!

16
GilLevi

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

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

  • プロジェクトに移動し、右クリックしてプロパティを選択します
  • 構成プロパティ-> C/C++->最適化
  • 最適化を選択し、それを最大化速度(/ O2)から無効(/ Od)に変更します enter image description here
23

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

4
GilLevi

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

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

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

2
Adrian McCarthy

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

curValueforループの外側のスコープから外れるためです。

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

printf("%c\n",curValue);
1
Yu Hao

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

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

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

これの代わりに:

printf("%s\n",curValue)
1
Michael

VisualStudioを再起動します。私のために働いた。

0
HAL9000