добавить часы показывает неопределенный идентификатор 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);
}

Мне пришлось использовать printf, чтобы показать значение curValue. лол.

Кто-нибудь сталкивался с таким поведением?

Редактировать: более странно это происходит. При отладке следующий код:

    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

Решение

Как сказал Иоахим: curValue определяется внутри цикла. Если окно просмотра в Visual Studio видит его как неопределенное значение, то вам следует отключить оптимизацию компилятора.

По умолчанию при оптимизации компилятора / O2 оптимизируется по скорости. Чтобы выключить это:

  • Зайдите в проект, щелкните правой кнопкой мыши и выберите свойства
  • Свойства конфигурации-> C / C ++ -> Оптимизация
  • выберите оптимизацию и измените ее с Максимизировать скорость (/ O2) на Отключено (/ Od)
    введите описание изображения здесь
23

Другие решения

У меня были включены оптимизации. Это испортило мою отладку.

4

Без printf первый цикл не имеет побочных эффектов и, таким образом, вероятно, оптимизируется в оптимизированной сборке. Во втором примере цикл, который инициализирует малый массив до 0, вероятно, заменяется секцией инициализированных данных.

Возможно, вам следует попытаться отладить неоптимизированную сборку.

Также обратите внимание, что отладчик Visual Studio имеет довольно хорошие визуализаторы для стандартных контейнеров. Так что, если весь смысл первого цикла был просто посмотреть на содержимое desc1Вы можете просто проверить это прямо в отладчике.

2

Помните, что переменная curValue допустимо только внутри цикла, если вы пытаетесь добавить его в часы, когда вы не в цикле, то переменная не определена.

1

Так как curValue выходит за рамки видимости for петля.

Также обратите внимание, что вы должны использовать %c в printf печатать char, %s используется для строк в стиле C

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

переменная curValue допустимо только внутри цикла. Если вы попытаетесь добавить его в «watch», когда вы не в цикле, тогда ваша переменная не будет определена.

Примечание: лучше распечатать это:

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

Вместо этого:

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

Перезапустите Visual Studio. Работал на меня.

0
По вопросам рекламы [email protected]