FuckOverflowException
20 May 2012 16:45![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Наконец начал класть последние мазки на своего монстра, хромающего сразу на все лапы. Ну, думаю сейчас половлю остатних блох, и... Как бы не так.
Вылез StackOverflowException. При входе в какой-то конструктор. Че делать? Ну, ладно завтра на работе на компе с большей памятью погоняю. Но сегодня-то что делать?
Вылез StackOverflowException. При входе в какой-то конструктор. Че делать? Ну, ладно завтра на работе на компе с большей памятью погоняю. Но сегодня-то что делать?
no subject
Date: 26 May 2012 16:03 (UTC)А старой версии, ошибка вела себя как ртутный шарик: когда в отладчике работаешь, то вываливется не там, когда без него. Плюс к тому, по разному в 2008 и 2010. И как при этом делить пополам?
no subject
Date: 26 May 2012 17:23 (UTC)Тогда и надо начать с самого верха.
no subject
Date: 26 May 2012 19:06 (UTC)Однако, в эти часы наметился прогресс:
стало ясно, что конструктор валится, если я создаю объект класса внутри программного модуля, а если как глобальный, то он не валится.
Но дальше идут новые чудеса, в которых пока не могу разобратся:
Начинаю по существу инициализировать переменную Х
(подкласс_большого_класса Х; )
моего объекта-пустышки, вызываю конструктор:
Х=подкласс_большого_класса (параметры конструктора);
внутри этого конструктора все делается верно. Выхожу из конструктора - Х остался каким был, т.е. неопределенным.
вставляю в эту програмку вспомогательную переменную того же подкласса:
подкласс_большого_класса темп(параметры конструктора);
Х=темп;
Результат: темп правильный, Х остался как был.
no subject
Date: 27 May 2012 02:32 (UTC)У меня на компе 2 версии винда XP: 32 и 64х. В каждой своя версия VS 2008.
Предыдущие чудеса были на 32. Они исчезли без каких либо изменений в 64. Программа продвинулась значительно дальше. Проблем с новым конструктором никаких: прекрасно сработал. Никаких бяк из прошлого поста.
Но потом случилось новое чудо. Я в текущей версии объект нового класса и несколько старых засунул в один супер-класс. И работаю с глобалным объектом этого суперкласса, сделав старые функции его членами. Короче, нахожусь в функции А этого класса вызванной из глобалного объекта, выполняю функцию Б. 'this' из А виден и в прекрасном состоянии, вызываю функцию С того же класса. При входе - stack оверфло, и this перестает быть виден изнутри С.
При этом вызове не строится ничего, не работает ни один конструктор. Ни одной команды С не успевает выполнится.
no subject
Date: 27 May 2012 19:07 (UTC)Для любопытствующих (интересно, кто из богов отвечает на небесах за программирование?), засунул прект в его текущем состоянии на http://newton.uam.mx/xgeorge/bicub_v_2008.rar.
no subject
Date: 28 May 2012 01:11 (UTC)Родилась дикая идея: в этом подлом случае надо делить пополам не назад, а вперед.
Поделю-ка тот модуль, котором не сработала ни одна команда, и посмотрю что выйдет.
no subject
Date: 29 May 2012 02:13 (UTC)Наверно я никогда не узнаю почему.
Ведь замена
cloud_of_ms_cl_in_3x3 *p_var;
p_var = new cloud_of_ms_cl_in_3x3(iii, jjj);
AT.CLD=*p_var;
delete p_var;
//AT.CLD= cloud_of_ms_cl_in_3x3(iii, jjj);
комментированного кода на некоментированный в одной из подпрограммок, не объясняет ничего. Кода у меня больше 500Кб и я всегда писал как в комментированном коде. Ничего плохого в этом не было.
Это как если бы в детективе труп неожиданно бесследно сперли, а мы продолжаем искать убийцу.