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 и повторяем итерацию.

Attachment: pgpdCaaiI2b4V.pgp
Description: PGP signature

Ответить