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はループ内でも未定義であることに注意してください。
ありがとう!
Joachimが言ったように:curValueはループ内で定義されます。 Visual Studioのウォッチウィンドウが未定義の値として表示する場合は、コンパイラの最適化をオフにする必要があります。
コンパイラ最適化のデフォルトは、速度を最適化する/ O2です。オフにするには:
最適化をオンにしました。それは私のデバッグを台無しにしました。
Printfがない場合、最初のループには副作用がないため、最適化されたビルドで最適化される可能性があります。 2番目の例では、小さい配列を0に初期化するループは、おそらく初期化されたデータセクションに置き換えられます。
おそらく、最適化されていないビルドでデバッグを試みる必要があります。
また、Visual Studioデバッガーには、標準コンテナー用の非常に優れたビジュアライザーがあることにも注意してください。したがって、最初のループの要点がdesc1
の内容を確認することだけだった場合は、デバッガーで直接調べることができます。
変数curValue
はループ内でのみ有効であることに注意してください。ループ内にいないときに時計に追加しようとすると、変数は定義されません。
curValue
がfor
ループの外側のスコープから外れるためです。
また、printf
を出力するにはchar
で%c
を使用する必要があることに注意してください。 %s
は、Cスタイルの文字列に使用されます。
printf("%c\n",curValue);
変数curValue
は、ループ内でのみ有効です。ループに入っていないときにそれを「ウォッチ」に追加しようとすると、変数は定義されません。
注:これを印刷することをお勧めします:
printf("%c\n",curValue);
これの代わりに:
printf("%s\n",curValue)
VisualStudioを再起動します。私のために働いた。