Aleksey Andreev <li...@mail.ru> writes: > 11.09.2014 14:50, Dmitrii Kashin пишет: >> Ага. Ну вот, я наконец понял, что неправильно детектировал проблему. >> Она именно в рекурсивном вызове маршевой функции, а make_step тут не при >> чём. >> >> Поскольку Вы упомянули про неявный return, я попробовал указать return >> явно, слегка переписав функцию, чтобы она возвращала результат: >> <...> >> Но всё равно получаю SegFault в следствие переполнения. > Дело ведь не в неявности вызова команды а в рекурсии. > Про неявный return ( ret ) я упомянул для того что бы показать где > освобождается стек.
Простите, Алексей, я хочу уточнить одну деталь. Я правильно сейчас понимаю, что Вы утверждаете, что рекурсивно описанная процедура всегда порождает рекурсивный процесс, выедающий стек? >> Тем не менее, я переписал этот кусок при помощи цикла, и программа >> вроде как валиться перестала. Такой результат меня полностью >> устраивает, спасибо. > > Если Grid1D не указатель, то многовато у вас копирования класса в > циклах. просядет производительность. Это цена удобства. Самая первая версия программы содержала указатели во всех функциях - в результате я замучился: во-первых бесконечные стрелочки сделали код совершенно нечитаемым, особенно в научных формулах (ну я где-то полгода назад жаловался в этой рассылке об этом), а во-вторых у меня стали получаться конструкции, которые меня очень уж угнетали, вот по типу этих вот: ---------- return &(grid->cells)[cell_number]; (get_cell(newgrid,i))->convergence = coef; ---------- Расстановка стрелочек, скобочек и амперсанов стала основной работой, которой я занимался вместо того, чтобы модифицировать логику программы. Так что при работе с Си, копирование имеет свои плюсы. Хотя конечно, мне рассказывали историю о человеке, который макросом заменял в исходниках точку. Правда, этого человека никто не любит. =) > Но для одноразового кода наверно пойдет :) Кто его знает, как у него судьба сложится? Вполне может быть станется, что "тяп-ляп и в продакшн". =/ > И я не понял, что там за танцы с newgrid, результат множественных правок? :) Да просто всё: есть сетка grid на предыдущем шаге по времени, а есть newgrid - на следующем. Высчитываем newgrid по grid, после чего присваиваем grid = newgrid и повторяем итерацию.
pgpdCaaiI2b4V.pgp
Description: PGP signature