Помощь - Поиск - Пользователи - Календарь
Полная версия: Error 202: Stack overflow
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Turboworld
В общем задачку сам себе ставил - просто сгерерировать массив, состоящий из записей, у которых первое поле это слово (просто строка из цифр пока генерируется), а второе - ссылка на родителя. Т.е. иерархическое, так сказать, деревце. И его нужно представить в виде:

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
Цитата
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
Цитата(volvo @ 19.08.2007 13:37) *

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

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

пасиб за оперативный ответ, но я сам уже догадался только что smile.gif) поставил перед параметром в процедуре VAR и всё стало пучком smile.gif
volvo
Лучше поставь Const, ибо у тебя массив изменяться не должен... Не привыкай делать "просто чтоб заработало"...
Turboworld
Цитата(volvo @ 19.08.2007 13:46) *

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

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

procedure showtree(Const m:massive;nomer,otstup:integer);
Turboworld
Цитата(volvo @ 19.08.2007 14:00) *

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

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


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

rolleyes.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.