16:50

С++

Здравствуйте , в коде есть 1 ошибка , которая почему-то у меня не ловится отладчиком ,
если кто подскажет что не так , буду премного благодарен .
Cобственно код

В общем программа работает , даже всё верно считает , но
есть тип примеров , когда программа попусту виснет .
Например если ввести действия с 2-мя отрицательными числами
f() = -2*(-2)

После ввода данного примера всё виснет . Пытался отладчиком
поймать ошибку , но он её не находит и выводит 4 (собственно что и должно быть)
Скорее всего ошибка в строчке node * p = new node (процедура Create_tree ) , т.к.
если написать до этой строчки что-то типа cout << "1" то 1 на экране появится(кстати от раза
к разу их то 1 то 4 ) , если же после , то нет .
Но что неправильного в этой строчке мне непонятно .
Заранее спасибо .

@темы: C++

Комментарии
24.05.2011 в 18:09

Ну, пробьешь ты головой стену. И что ты будешь делать в соседней камере?
по симптомам - пишетесь мимо памяти.... проверьте работу с массивами.
24.05.2011 в 19:37

Mr.Freedom возможно , но дело в том , что на практике ,когда я выходил за границы массива отладчик это отлавливал , а здесь я почему-то при отладке
ввожу например -2*5 и он нигде не прерывается , а на консоли горит -10 , а если просто запускаю , то просто виснет .
Я с таким вообще впервые сталкиваюсь .
24.05.2011 в 20:03

Причём если ввести -2*10 , то всё уже работает или (-2)*5
24.05.2011 в 20:19

nvse

Сделай в коде

printf ("метка 1");
printf ("метка 2");
...

выявишь фрагмент кода, на которой виснет.
24.05.2011 в 20:23

Ну, пробьешь ты головой стену. И что ты будешь делать в соседней камере?
на самом деле учись дебаггингу=)
очень мало каких ошибок не найти им. Тебе все равно это понадобится.
ставь контрольные значения, смотри на каждом шаге.
Я надеюсь у тебя вижал студиа?
24.05.2011 в 20:52

Trotil спасибо , делал , пока не помогает
Mr.Freedom да , 2008 студия
24.05.2011 в 21:12

В общем сейчас сделал 2 метки в процедуре show_tree


Цифра 1 горит а 2 нет , то есть что-то не так с root->value наверное .
24.05.2011 в 21:41

Скопировал код в 2010 студию, работает.

Можешь выложить бинарник, который получился, для скачивания?
Интересно будет посмотреть, в чём будет ошибка.
24.05.2011 в 21:43

Очень странно , я тоже копировал в 2010 студию но и там тоже не работало. Бинарник в смысле exe-шник или cpp-шник?
24.05.2011 в 21:46

exe-шник.
И лучше два - один в режиме Debug, другой - в режиме Release (переключатель где-то вверху на панели инструментов).
А лучше еще дополнительно - саму папку с проектом в 2010.
24.05.2011 в 21:54

Ну, пробьешь ты головой стену. И что ты будешь делать в соседней камере?
слушай, проверь не ноль ли у тебя root - тогда может упасть.
24.05.2011 в 21:56

Mr.Freedom проверял , к сожалению не NULL
24.05.2011 в 22:09

попозже сегодня посмотрю.
24.05.2011 в 22:11

спасибо
24.05.2011 в 22:44

На суть проблемы это не повлияет , но думаю у меня коде
не правильно прописаны комманды delete []p->left и delete[] p->right . Вместо них думаю нужно просто delete (p->right) и delete (p->left) .
25.05.2011 в 10:52

Ошибка не в реализации класса. Ошибка в использовании cout. Либо внутренняя ошибка, либо какой-то тонкий момент есть, пока не разобрался. Рецепт на скорую руку, переписать фрагмент без использования cout.

Если заменить на:

int s=4;

if (error == false)
cout << "Результат : " << s << endl ;
else
cout << "Неккоректный ввод" << endl ;

то появляется точно такая же ошибка.
Теперь о том, что это за ошибка. Отладчик windbg выдал такое:

читать дальше

Беглое прохождение по стеку ничего не дало, причину такого странного поведения пока не знаю.
25.05.2011 в 13:46

Ничего себе , никогда бы не подумал , что ошибка может заключаться в этом , а главное и впрямь если написать
вместо cout << "Результат : " << s << endl строку printf("Результат : %f\n",root->value) ; то всё отлично работает . Спасибо .