2013-07-27 25 views
16

VS 2012で奇妙な動作が発生しました(私はcppで書いています)。ウォッチを追加すると、未定義の識別子が表示されます。Visual Studio 2012、cpp

私は変数の "add watch"をクリックし、 "identifier is undefined"と言います。

は、ここでは、コードの例です:

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は未定義です。

ありがとうございます!

+0

問題に対する別の解決策は有効にコンパイラの最適化を残したが、最適化されたコードでは動作し、追加のデバッグ情報を生成するようにコンパイラーに伝える/ Zoとを(最適化されたデバッグを強化)できるようにすることです。これは、Visual Studio 2013 Update 3以降でのみ使用できます。 https://msdn.microsoft.com/en-us/library/dn785163.aspx –

答えて

22

Joachimが言ったように、curValueはループ内で定義されています。ビジュアルスタジオのウインドウウインドウがそれを未定義の値と見なすならば、コンパイラの最適化をオフにするべきです。

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

  • ゴー
  • 、右クリックし、[プロパティ]を選択しますが投影
  • の構成プロパティ - > C/C++する - >最適化
  • 選択の最適化、および最大化速度(/ O2)からそれを変更無効(/ OD)を enter image description here
+2

これは主にデバッグコンフィギュレーションモードで使用され、バグのない最適化と最適化の両方を行うリリースには適していないことにも注意してください。 ありがとうございます。 –

1

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

+0

回答ありがとうございますが、ループ内でさえも未定義です。 – GilLevi

+3

@ user2215359最適化を有効にしましたか?彼らはデバッグ時に物事を混乱させる可能性があります。そして、この場合、もしループが 'curValue'への代入以上のものを含んでいなければ、*最適化されるでしょう*。 –

+1

答えをありがとう。最適化を有効にしているかどうかを確認するにはどうすればよいですか? – GilLevi

1

curValueは、forループ外のスコープから外れるためです。

printf%cを入力してcharを印刷することにも注意してください。 %sは、Cスタイルの文字列に使用されます。

1

変数curValueは、ループ内でのみ有効です。ループしていないときに "watch"に追加しようとすると、変数は定義されません。

注:この代わりの

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

:より良いあなたは、この印刷する必要があり

printf("%s\n",curValue) 
4

を私は最適化がオンになっていました。それは私のデバッグを混乱させた。

2

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

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

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

+0

お返事いただいた皆様に感謝します。 – GilLevi

関連する問題