Aleksey Andreev <[email protected]> writes: > 11.09.2014 13:25, Dmitrii Kashin пишет: > >> Вот так это примерно происходит: >> ---------------------------------------- >> void >> march (Grid1D grid) >> { >> <...> >> Grid1D newgrid = make_step(grid, tau); >> march(newgrid); >> }; >> ---------------------------------------- > > Извините, код не смотрел, но из того что вижу поясню: > Вы из функции march вызываете еще одну march, таким образом не > освобождая стек вызовов. > Cтек освободится при вызове неявного return в конце ф-ции. > В данном случае стек тратится на сохранение точки возврата из функции, > но возврата не происходит.
Ага. Ну вот, я наконец понял, что неправильно детектировал проблему.
Она именно в рекурсивном вызове маршевой функции, а make_step тут не при
чём.
Поскольку Вы упомянули про неявный return, я попробовал указать return
явно, слегка переписав функцию, чтобы она возвращала результат:
----------------------------------------
Grid1D
march (Grid1D grid)
{
<...>
if (!finFlag)
{
printf("Making iteration %06d; Passed time: %f\n", grid.iter+1,
grid.time);
Grid1D newgrid = make_step(grid, tau);
grid = newgrid;
}
else
{
printf("Final conditions are reached! Finishing.\n");
return grid;
};
return grid;
}
----------------------------------------
Но всё равно получаю SegFault в следствие переполнения.
Тем не менее, я переписал этот кусок при помощи цикла, и программа вроде
как валиться перестала. Такой результат меня полностью устраивает,
спасибо.
PS: Я ещё не сразу сообразил, кстати, что gcc требует указание флага -O2
для хвостовой рекурсии. Я, лиспер, хорошо живу: у нас-то она сама собой
разумеется. А в Си она, оказывается, *оптимизация*. Ну это я так,
побухтеть.
PPS: А вот не подскажете ли мне ещё эху или рассылку, где с подобными
вопросами я не был бы белой вороной? =)
pgpXKNvqbLspz.pgp
Description: PGP signature

