Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Error 202: Stack overflow

Автор: Turboworld 19.08.2007 16:33

В общем задачку сам себе ставил - просто сгерерировать массив, состоящий из записей, у которых первое поле это слово (просто строка из цифр пока генерируется), а второе - ссылка на родителя. Т.е. иерархическое, так сказать, деревце. И его нужно представить в виде:

Root
..Folder1
....Folder1_child1
....Folder1_child2
..Folder2

Т.е. в древовидной форме (просто с отступами).

Сделал вроде как рекурсию (самовызов процедуры), однако при первом же заходе в нее на слове begin начала процедуры выскакивает Stack overflow. что-то не пойму в чём дело =/



program tree;
uses crt;
const nmax=100;
type leaf=record
name:string[255]; {nazvanie folder'a}
parent:integer; {nomer elementa v massive - roditelya}
end;
massive = array[1..nmax] of leaf;
var i,j,n:integer;
m:massive;
stemp:string;

procedure showtree(m:massive;nomer,otstup:integer);
var i,j:integer;
space:string;
begin
for i:=1 to n do begin
if m[i].parent=nomer then begin
space:='';
for j:=1 to otstup do begin
space:=space+'.';
end;
writeln(space,m[i].name);
showtree(m,i,otstup+1);
end;
end;
end;
{====================================================}


begin

randomize;
clrscr;
n:=0;
{add first element}
m[1].name:='Sample';
m[2].parent:=0;
n:=n+1;
{add some other elements - 10 items}
for i:=1 to 10 do begin
j:=random(1000);
str(j,stemp);
m[n+1].name:=stemp;
m[n+1].parent:=random(n+1); {0..n}
n:=n+1;
end;
{print the massive m}
for i:=1 to n do begin
writeln(i:2,'=',m[i].name:5,' : ',m[i].parent:2);
end;

{show tree}
writeln('===========This is tree==========');
showtree(m,0,0);
writeln('........PRESS ENTER to EXIT.......');
readln;
end.





Автор: volvo 19.08.2007 16:37

Цитата
const 
nmax=100;
type
leaf=record { <--- Размер каждого элемента = 255 + 2 = 257 байт }
name:string[255]; {nazvanie folder'a}
parent:integer; {nomer elementa v massive - roditelya}
end;
massive = array[1..nmax] of leaf; { <--- 100 элементов }

Умножаем 100 на 257, получаем сколько? А теперь заходим в меню Options -> Memory Sizes и смотрим, какой размер стека...

Добавлено через 1 мин.
Я к тому, что вот тут:
Цитата
procedure showtree(m:massive;nomer,otstup:integer);
массив передается по значению - значит, ВЕСЬ загоняется в стек...

Автор: Turboworld 19.08.2007 16:41

Цитата(volvo @ 19.08.2007 13:37) *

Умножаем 100 на 257, получаем сколько? А теперь заходим в меню Options -> Memory Sizes и смотрим, какой размер стека...

Добавлено через 1 мин.
Я к тому, что вот тут:
массив передается по значению - значит, ВЕСЬ загоняется в стек...

пасиб за оперативный ответ, но я сам уже догадался только что smile.gif) поставил перед параметром в процедуре VAR и всё стало пучком smile.gif

Автор: volvo 19.08.2007 16:46

Лучше поставь Const, ибо у тебя массив изменяться не должен... Не привыкай делать "просто чтоб заработало"...

Автор: Turboworld 19.08.2007 16:56

Цитата(volvo @ 19.08.2007 13:46) *

Лучше поставь Const, ибо у тебя массив изменяться не должен... Не привыкай делать "просто чтоб заработало"...

что еще за const? blink.gif

Автор: volvo 19.08.2007 17:00

Тебя что, спросить "что еще за Var"? Спецификатор Var разрешает изменять данные, переданные с ним, Const - запрещает... Попробуй...

procedure showtree(Const m:massive;nomer,otstup:integer);

Автор: Turboworld 19.08.2007 17:02

Цитата(volvo @ 19.08.2007 14:00) *

Тебя что, спросить "что еще за Var"? Спецификатор Var разрешает изменять данные, переданные с ним, Const - запрещает... Попробуй...

procedure showtree(Const m:massive;nomer,otstup:integer);


Вообще говоря, про CONST вот там вот (перед параметром процедуры/функции) - впервый слышу. Хотя с паскалем знаком лет 10.

rolleyes.gif