2013-07-27 7 views
16

Ho riscontrato il comportamento più strano in VS 2012 (sto scrivendo in cpp).aggiungi un orologio mostra un identificatore indefinito visual studio 2012, cpp

Faccio clic su "aggiungi orologio" su una variabile e viene visualizzato "identificatore non definito".

Ecco un esempio del codice:

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

ho dovuto usare printf per mostrare il valore di curValue. lol.

Qualcuno ha riscontrato un simile comportamento?

Modifica: più strano si verifica. Quando si esegue il debug del seguente codice:

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; 
    } 

Il debugger salta semplicemente il ciclo con b1 [k] = 0;

Nota: curValue non è definito nemmeno all'interno del loop.

Grazie!

+0

Un'altra soluzione al problema è quello di lasciare le ottimizzazioni del compilatore attivata, ma abilitare/Zo (Enhance debug Optimized) dice al compilatore di generare informazioni aggiuntive di debug che lavorano con il codice ottimizzato. Questo è disponibile solo per Visual Studio 2013 aggiornamento 3 o successivo. vedere https://msdn.microsoft.com/en-us/library/dn785163.aspx –

risposta

22

Come ha detto Joachim: curValue è definito all'interno del ciclo. Se la finestra di controllo in Visual Studio lo vede come un valore non definito, dovresti disattivare l'ottimizzazione del compilatore.

L'ottimizzazione del compilatore predefinita è/O2 ottimizzata per la velocità. Per disattivarlo:

  • Vai al progetto, fare clic destro e selezionare Proprietà
  • Configurazione Proprietà-> C/C++ -> Ottimizzazione
  • selezionare l'ottimizzazione e modificarlo da massimizzare la velocità (/ O2) per disabili (/ od) enter image description here
+2

Si noti inoltre che questo è principalmente utilizzato per una modalità di configurazione di debug, non adatto alle versioni che dovrebbero essere prive di bug e ottimizzate. Grazie. –

1

Ricordare che la variabile è valida solo all'interno del ciclo, se si tenta di aggiungerla all'orologio quando non si è nel ciclo, la variabile non è definita.

+0

Grazie per la risposta, ma non è definito nemmeno all'interno del ciclo. – GilLevi

+3

@ user2215359 Le ottimizzazioni sono attive? Possono rovinare tutto quando si esegue il debug. E in questo caso, se il ciclo non contiene più del compito a 'curValue' molto probabilmente * sarà * ottimizzato. –

+1

Grazie per la risposta. Come posso verificare se sono attivate le ottimizzazioni? – GilLevi

1

Perchécicloesce dal campo di applicazione.

Si noti inoltre che è necessario utilizzare %c in printf per stampare char. %s viene utilizzato per le stringhe in stile C.

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

La variabile curValue è valida solo all'interno del ciclo. Se proverai ad aggiungerlo al "watch" quando non sei nel ciclo, la tua variabile non sarà definita.

Nota: Meglio si dovrebbe stampare questo:

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

Invece di questo:

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

avevo ottimizzazioni acceso. Ciò ha incasinato il mio debugging.

2

Senza il printf, il primo ciclo non ha effetti collaterali ed è quindi probabilmente ottimizzato via in una build ottimizzata. Nel secondo esempio, il ciclo che inizializza il piccolo array su 0 è probabilmente sostituito da una sezione di dati inizializzata.

Probabilmente dovresti provare a eseguire il debug con una build non ottimizzata.

Si noti inoltre che il debugger di Visual Studio ha degli ottimi visualizzatori per i contenitori standard. Quindi se l'intero punto del primo ciclo era solo per sbirciare il contenuto di desc1, probabilmente lo si può esaminare direttamente nel debugger.

+0

Grazie a tutti quelli che hanno risposto. – GilLevi