2013-07-27 14 views
16

Znam najdziwniejsze zachowanie w VS 2012 (piszę w cpp).dodać zegarek pokazuje niezdefiniowany identyfikator visual studio 2012, cpp

Klikam "dodaj zegarek" na zmiennej i mówi "identyfikator jest niezdefiniowany".

Oto przykład kodu:

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

musiałem użyć printf pokazać wartość curValue. lol.

Czy ktoś napotkał takie zachowanie?

Edycja: bardziej dziwne to się zdarza. Podczas debugowania następującego kodu:

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

Debugger po prostu pomija pętlę za pomocą b1 [k] = 0;

Uwaga: wartość curValue jest niezdefiniowana nawet w pętli.

Dzięki!

+0

Innym rozwiązaniem tego problemu jest pozostawienie optymalizacje z kompilatora włączone, ale włączyć/Zo (Enhance Optimized debugowanie) informujący, że kompilator generuje dodatkowe informacje diagnostyczne, które współpracują z zoptymalizowanego kodu. Ta opcja jest dostępna tylko dla programu Visual Studio 2013 w wersji 3 lub nowszej. zobacz https://msdn.microsoft.com/en-us/library/dn785163.aspx –

Odpowiedz

22

Jak powiedział Joachim: curValue jest zdefiniowany wewnątrz pętli. Jeśli okno podglądu w studio graficznym zobaczy jako wartość nieokreśloną, wyłącz optymalizację kompilatora.

Domyślna optymalizacja kompilatora to/O2 optymalizacja prędkości. Aby ją wyłączyć:

  • idź do projektu, kliknij prawym przyciskiem myszy i wybierz Właściwości
  • Konfiguracja Ustawienia-> C/C++ -> Optymalizacja
  • wybierz optymalizacji i zmienić go z Maksymalizacja prędkości (/ O2) do Disabled (/ OD) enter image description here
+2

Należy również zauważyć, że jest to głównie używane w trybie konfiguracji debugowania, nieodpowiednie dla wersji, które powinny być wolne od błędów i zoptymalizowane. Dziękuję. –

1

Pamiętaj, że zmienna curValue jest ważna tylko w pętli, jeśli spróbujesz dodać ją do zegarka, gdy nie znajdujesz się w pętli, zmienna nie jest zdefiniowana.

+0

Dzięki za odpowiedź, ale jest niezdefiniowana nawet w pętli. – GilLevi

+3

@ user2215359 Czy masz włączone optymalizacje? Mogą one zepsuć rzeczy podczas debugowania. W tym przypadku, jeśli pętla nie zawiera więcej niż przypisanie do 'curValue', najprawdopodobniej * zostanie * zoptymalizowane. –

+1

Dzięki za odpowiedź. Jak sprawdzić, czy mam włączone optymalizacje? – GilLevi

1

Ponieważ curValue wychodzi poza zakres pętli for.

Należy również pamiętać, że należy użyć %c w printf, aby wydrukować char. %s jest używany do ciągów w stylu C.

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

Zmienna curValue jest ważna tylko wewnątrz pętli. Jeśli spróbujesz dodać go do "oglądania", gdy nie jesteś w pętli, twoja zmienna nie będzie zdefiniowana.

Uwaga: Lepiej należy wydrukować to:

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

Zamiast tego:

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

miałem optymalizacje włączony. To popsuło mi debugowanie.

2

Bez printf pierwsza pętla nie ma efektów ubocznych i dlatego jest prawdopodobnie zoptymalizowana w optymalnej kompilacji. W drugim przykładzie pętla, która inicjuje małą tablicę do 0, prawdopodobnie zostanie zastąpiona zainicjalizowaną sekcją danych.

Prawdopodobnie powinieneś spróbować debugować z niezoptymalizowaną kompilacją.

Należy również pamiętać, że debuger Visual Studio ma całkiem dobre wizualizatory dla standardowych kontenerów. Więc jeśli cały punkt pierwszej pętli miał tylko przeglądać zawartość desc1, prawdopodobnie możesz po prostu sprawdzić ją bezpośrednio w debugerze.

+0

Dziękuję wszystkim, którzy odpowiedzieli. – GilLevi

Powiązane problemy