gxachaturov: (Default)
gxachaturov ([personal profile] gxachaturov) wrote2012-05-20 04:45 pm

FuckOverflowException

Наконец начал класть последние мазки на своего монстра, хромающего сразу на все лапы. Ну, думаю сейчас половлю остатних блох, и... Как бы не так.

Вылез StackOverflowException. При входе в какой-то конструктор. Че делать? Ну, ладно завтра на работе на компе с большей памятью погоняю. Но сегодня-то что делать?

[identity profile] txtarunz.livejournal.com 2012-05-26 05:23 pm (UTC)(link)
То-есть, баг был всегда, просто проявлялся по разному?
Тогда и надо начать с самого верха.

[identity profile] gxachaturov.livejournal.com 2012-05-26 07:06 pm (UTC)(link)
Нет, я так не думаю. Баг появился вместе с созданием нового класса, соданного для новой цели.

Однако, в эти часы наметился прогресс:

стало ясно, что конструктор валится, если я создаю объект класса внутри программного модуля, а если как глобальный, то он не валится.

Но дальше идут новые чудеса, в которых пока не могу разобратся:

Начинаю по существу инициализировать переменную Х

(подкласс_большого_класса Х; )

моего объекта-пустышки, вызываю конструктор:

Х=подкласс_большого_класса (параметры конструктора);

внутри этого конструктора все делается верно. Выхожу из конструктора - Х остался каким был, т.е. неопределенным.

вставляю в эту програмку вспомогательную переменную того же подкласса:

подкласс_большого_класса темп(параметры конструктора);
Х=темп;

Результат: темп правильный, Х остался как был.

[identity profile] gxachaturov.livejournal.com 2012-05-27 02:32 am (UTC)(link)
Новости с фронта.

У меня на компе 2 версии винда XP: 32 и 64х. В каждой своя версия VS 2008.

Предыдущие чудеса были на 32. Они исчезли без каких либо изменений в 64. Программа продвинулась значительно дальше. Проблем с новым конструктором никаких: прекрасно сработал. Никаких бяк из прошлого поста.

Но потом случилось новое чудо. Я в текущей версии объект нового класса и несколько старых засунул в один супер-класс. И работаю с глобалным объектом этого суперкласса, сделав старые функции его членами. Короче, нахожусь в функции А этого класса вызванной из глобалного объекта, выполняю функцию Б. 'this' из А виден и в прекрасном состоянии, вызываю функцию С того же класса. При входе - stack оверфло, и this перестает быть виден изнутри С.

При этом вызове не строится ничего, не работает ни один конструктор. Ни одной команды С не успевает выполнится.
Edited 2012-05-27 02:34 (UTC)

[identity profile] gxachaturov.livejournal.com 2012-05-27 07:07 pm (UTC)(link)
Сейчас эффект в обеих (32 и 64) операционках стабильно одинаков, как он описан в предыдущем комменте для 64. И куда дальше делить пополам?

Для любопытствующих (интересно, кто из богов отвечает на небесах за программирование?), засунул прект в его текущем состоянии на http://newton.uam.mx/xgeorge/bicub_v_2008.rar.

[identity profile] gxachaturov.livejournal.com 2012-05-28 01:11 am (UTC)(link)
Ага, детектив, так детектив. Буду поддерживать интригу до конца.

Родилась дикая идея: в этом подлом случае надо делить пополам не назад, а вперед.

Поделю-ка тот модуль, котором не сработала ни одна команда, и посмотрю что выйдет.

[identity profile] gxachaturov.livejournal.com 2012-05-29 02:13 am (UTC)(link)
Ну что вам сказать, коллеги... Идея была продуктивна. Но дело не в этом. Найдя место, где все валилось, я сделал маленькое изменение, после чего эффект исчез.

Наверно я никогда не узнаю почему.

Ведь замена

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Кб и я всегда писал как в комментированном коде. Ничего плохого в этом не было.

Это как если бы в детективе труп неожиданно бесследно сперли, а мы продолжаем искать убийцу.
Edited 2012-05-29 02:23 (UTC)