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: А вот не подскажете ли мне ещё эху или рассылку, где с подобными
вопросами я не был бы белой вороной? =)

Attachment: pgpXKNvqbLspz.pgp
Description: PGP signature

Ответить