Aleksey Andreev <li...@mail.ru> 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