11.09.2014 23:32, Dmitrii Kashin пишет: >>> Но всё равно получаю SegFault в следствие переполнения. >> Дело ведь не в неявности вызова команды а в рекурсии. >> Про неявный return ( ret ) я упомянул для того что бы показать где >> освобождается стек. > Простите, Алексей, я хочу уточнить одну деталь. Я правильно сейчас > понимаю, что Вы утверждаете, что рекурсивно описанная процедура всегда > порождает рекурсивный процесс, выедающий стек? Выеданием стека я назвал не переполнение а активное его использование. Если оптимизатор построил хвостовую, то стек не задействуется. На сколько я помню разворачивается в цикл. При нормальных условиях дефолтного размера стека хватает даже достаточно глубоких рекурсиях. Он нужен для хранения адреса возврата и, в зависимости от способа вызова функции, параметров. В первоначальном коде я не обнаружил условия выхода из рекурсии. А значит у вас выедался стек при вызове функции + расход на выделение памяти под класс в каждом вызове, возможно выделение памяти производилось тоже на стеке. Думаю именно в этом и была причина сегфолта - стек закончился в следствии ничем не ограниченного выедания :) >>> Тем не менее, я переписал этот кусок при помощи цикла, и программа >>> вроде как валиться перестала. Такой результат меня полностью >>> устраивает, спасибо. >> Если Grid1D не указатель, то многовато у вас копирования класса в >> циклах. просядет производительность. > Это цена удобства. Самая первая версия программы содержала указатели во > всех функциях - в результате я замучился: во-первых бесконечные > стрелочки сделали код совершенно нечитаемым, особенно в научных формулах > (ну я где-то полгода назад жаловался в этой рассылке об этом), а > во-вторых у меня стали получаться конструкции, которые меня очень уж > угнетали, вот по типу этих вот: > ---------- > return &(grid->cells)[cell_number]; > (get_cell(newgrid,i))->convergence = coef; > ---------- > Расстановка стрелочек, скобочек и амперсанов стала основной работой, > которой я занимался вместо того, чтобы модифицировать логику программы. Сильно зависит от проработанности структуры программы.
> Так что при работе с Си, копирование имеет свои плюсы. Как раз на Си проще передать указатель чем копировать. А вот Си++ делает это самостоятельно. С уважением, Алексей А.

