Microsoft Visual C++ .NET, debugging, watch
По данным, приведённым тобой, можно сделать только одно предположение - там действительно нули.
Но там не нули, например:
a10=a[10];
в окошке watch:
a[10] 0.0
a10 0.5
-------------
double * a;
double a10;
эмм, a[10] в c/cpp - это адрес переменной, насколько я помню
Ты видишь эти данные в окне watch сразу после выполнения этой строчки? ты уверен, что не меняется область видимости? Проверь простейший случай и приведи его полностью здесь.
эмм, a[10] в c/cpp - это адрес переменной, насколько я помнюНе правильно помнишь.
а также, содержит ли проект дебажную информацию. Скажем, release по умолчанию не содержит, брикпоинты могут срабатывать не там, где нужно, или не срабатывать вовсе, и вотч тоже будет кривой.
a10=a[10], на следующий ход (f10 получается описанная картина. Впрочем, где бы я не ставила брейкпоинты, значения элементов массива равны нулю, если верить watch-у.
Если бы поменялась область видимости, то он в окне watch напишет out of scope, разве не так?
содержит ли проект дебажную информацию. Скажем, release по умолчанию не содержит
Этого я не поняла.
Не правильно помнишь.а почему тогда scanf("%d",a[10]) работает, а не вызывает ошибку?
Странно, а у меня segfault.
значит я действительно все забыл
Если бы поменялась область видимости, то он в окне watch напишет out of scope, разве не так?Если поменялась область видимости, то а может быть не тем а, что ты подразумеваешь.содержит ли проект дебажную информацию. Скажем, release по умолчанию не содержитЭтого я не поняла.
"дебажная" (отладочная) информация генерируется компилятором для удобной и корректной работы отладчика. Генерируется она по умолчанию в debug-версии, не генерируется в release-версии. Переключать debug/release - вверху есть панелька с выбором.
а ещё лучше всё-таки выкинуть из проекта всё, что не исключает ошибку и выложить сюда полный код оставшегося.
да тупо оптимизация включена может быть
а почему тогда scanf("%d",a[10]) работает, а не вызывает ошибку?А почему ты пишешь кусок кода, не проверив его?
a[b] эквивалентно *(a+b здесь это не раз писали.
Косяк, описанный мной выше, происходит в теле одной функции.Если у тебя в программе где-то ещё есть переменная a, то watch может путать её и ту переменную, которую тебе хочется просмотреть. Такое часто случается, особенно если обе эти переменные видны в scope брейкпоинта:
int a[64];
void f
{
int* a = new int[32];
// breakpoint может показывать только глобальную версию переменной a
}
содержит ли проект дебажную информацию. Скажем, release по умолчанию не содержит
--------------------------------------------------------------------------------
Этого я не поняла.
Тут написано, что если собрать проект в конфигурации Release, то дебаггер будет плохо работать. Для дебага настройки проекта лучше оставить по умолчанию и запускать программу в конфигурации Debug.
Если поменялась область видимости, то а может быть не тем а, что ты подразумеваешь.
и это
Если у тебя в программе где-то ещё есть переменная a, то watch может путать её и ту переменную, которую тебе хочется просмотреть. Такое часто случается, особенно если обе эти переменные видны в scope брейкпоинта:
значит, что может быть у меня в некоторой функции объявлен массив или другая переменная с таким же названием, как и глобальный массив, то нет. Я специально выбрала "уникальное" имя для этого массива.
В Build->Configuration Manager стоит Debug
Действительно, сейчас попробую повыкидывать как можно больше. Найду минимальный текст, который сопровождается этим косяком.
class BFB
{
public:
double * ph;
};
//class BFB;
BFB * blaz;
int main
{
blaz = new BFB;
double * velocity;
velocity = new double [24];
velocity[23]=0.6;
blaz->ph = new double [24];
blaz->ph[23]=0.5;
delete [] velocity;
delete [] blaz->ph;
return 0;
}
в окне watch
velocity[23] 0.6
blaz->ph[23] 0.0
во-вторых, если объявление класса таки перенести перед функцией main, описанная тобой ошибка не наблюдается в свежесозданном Win32 Console Application проекте.
double ph[1000];
и убрать new, соответственно,
то косяк исчезает.
Что я делаю не так?
В какой IDE пишешь?
MSVS, написано же вверху.
MSVS, написано же вверху.а) этого нигде не написано
б) они бывают разные
class BFB;вот эта фигня может смущать watch.
твой пример у меня не компилируется, когда объявление класса после использования, но вот такое показывает правильно
class BFB
{
public:
double * ph;
};
//class BFB;
BFB * blaz;
int main
{
blaz = new BFB;
double * velocity;
velocity = new double [24];
velocity[23]=0.6;
blaz->ph = new double [24];
blaz->ph[23]=0.5;
delete [] velocity;
delete [] blaz->ph;
return 0;
}
какая командная строка для компилятора? (это можно узнать в свойствах проекта)
class BFB;
вот эта фигня может смущать watch.
Как она может смущать watch?
Объявление класса, конечно, идет до функции main, но в другом файле. Поэтому я приписала его снизу. Больше так делать не буду, чтобы никого не смущать.
какая командная строка для компилятора?
/I "D:\...\prog" /AI "D:\...\prog\Debug" /D "WIN32" /D "_DEBUG" /D "_MBCS" /FD /EHsc /MTd /GS /Fo"Debug/" /Fd"Debug/vc70.pdb" /W3 /nologo /c /Zi /clr /TP
Как она может смущать watch?например, тем что он может не находить объявление класса
Объявление класса, конечно, идет до функции main, но в другом файле.лучше было сделать это через h-файл, чем через "class BFB;"
не уверен, но попробуй /FD убрать. В хелпе про него что-то мутно написано.
а если у меня и через *.h, и "class BFB;", то что получится? Если закомментировать "class BFB;", косяк остается.
Я нашла, что мешало мне:
Use managed extensions.
Что это?
Выбрала - не использовать, и в окне watch все стало нормально отображаться.
Большое всем спасибо.
и какая же всё-таки студия использовалась?..
и какая же всё-таки студия использовалась?...NET - похоже 2003
Скажу в обмен на информацию, что такое managed extensions, и что означает use managed extensions.
использовать фишки управляемого кода.
http://ru.wikipedia.org/wiki/Managed_C%2B%2B
managed c++, c++ managed extentions - одно и то же.
и всё же лучше переходить на 2008 студию
managed c++, c++ managed extentions - одно и то же.
и всё же лучше переходить на 2008 студию
Оставить комментарий
Robert08
Объясните, пожалуйста, почему в окне watch выводятся нули, а не "реальные" значения переменных.С чем это может быть связано?