Здравствуйте, сообщество. Я понимаю, что это, возможно, не самое правильное место для вопроса по программированию, но мне достоверно известно, что здесь сидят более-менее грамотные люди, которые мне действительно могут помочь. И других таких мест мне, увы, знать не довелось.
Я пишу программу на C++ (использую только подмножество синтаксиса языка
С99 плюс перегрузку операторов - никаких классов/объектов/потоков).
Суть программы сводится к следующему: она берёт "сетку", модифицирует
все её значения (шагает), после чего проделывает с полученной сеткой
аналогичные операции. И так до тех пор, пока не достигнет какого-нибудь
результата.
Так вот, я обнаружил, что умудряюсь, похоже, продавить стек.
После примерно 20 тысяч шагов программа выдаёт SegFault и
завершается. Я посмотрел в gdb бэктрейс и увидел там over20000 фреймов.
Собственно, хочется, чтобы кто-то посмотрел и по возможности помог
советом: вот отсюда[1] можно скачать архив с последней версией.
Собирать надо одним из следующих образов:
1) make test-shock1
2) make test-shock2a
3) make test-shock2b
В чём суть:
В бэктрейсе множественные вызовы функции make_step, которая вызывается
из маршевой функции на каждой итерации.
Вот так это примерно происходит:
----------------------------------------
void
march (Grid1D grid)
{
<...>
Grid1D newgrid = make_step(grid, tau);
march(newgrid);
};
----------------------------------------
А вот как определена сама функция:
----------------------------------------
Grid1D
make_step(Grid1D grid, double tau)
{
Grid1D newgrid = grid_skel(grid);
newgrid.iter += 1;
newgrid.time += tau;
double h = grid.h;
double N = grid.N;
ConservVars lf;
ConservVars rf = count_left_flux(grid,0,tau);
for (unsigned int i=0; i<N; i++)
{
lf = rf;
if (i != N-1)
rf = count_left_flux(grid,i+1,tau);
newgrid.cells[i].vars = grid.cells[i].vars - tau*(rf-lf)/h;
};
free(grid.cells);
return newgrid;
};
----------------------------------------
Никак не пойму, что ж с ней не так-то: функция была вызвана, отработала,
вернула результат. Значит кадр в стеке ей вроде бы уже не нужен. Но он
остаётся. Почему?
[1] http://git.freehck.ru/cfrolov.git/
pgptHcPWwDcm5.pgp
Description: PGP signature

