Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.17;
Скачать: CL | DM;

Вниз

Рекурсивный обход дерева   Найти похожие ветки 

 
Wito   (2009-11-21 18:51) [0]

Прошу помочь с алгоритмом построения, обхода и вывода дерева на экран.
Вот код, работает он неправильно ("насилие над доступом").
TPGameState = ^TGamestate;
TGameState = record
 links:array[0..5] of TPGameState;
 name:string[200];
end;
...
var
root: TPGameState;
...
//Создание дерева
procedure newvetv(parrent:TPGamestate;hod:byte);
var i:byte;
begin
 if length(parrent^.name)>100 then exit;
 new(parrent.links[hod]);
 parrent^.links[hod]^.name:="sub"+parrent^.name;
 for I := 0 to 5 do newvetka(parrent^.links[hod],i);
end;

//Вывод дерева в TTreeView
function showalltree(rt:TPGameState; tree:TTreeNode):boolean;
var i:byte;
begin
if rt=nil then exit;
for i := 0 to 5 do if rt^.links[i]<>nil then
      showalltree(rt^.links[i],form1.TV1.Items.AddChild(tree,rt^.name));
end;

...
newvetka(root,0);
showalltree(root,nil);


 
Игорь Шевченко ©   (2009-11-21 19:01) [1]


> Вот код, работает он неправильно ("насилие над доступом").


исправь, все в твоих руках


 
Не занят   (2009-11-22 00:39) [2]

Violation это нарушение а не насилие


 
Германн ©   (2009-11-22 01:06) [3]


> Прошу помочь с алгоритмом


> Вот код, работает он неправильно

То бишь "дайте правильный код", а алгоритм не очень-то и нужен.


 
имя   (2009-11-22 01:43) [4]

Удалено модератором


 
antoxa   (2009-11-22 04:18) [5]

Удалено модератором


 
Григорьев Антон ©   (2009-11-22 10:55) [6]

Так как links содержит неуправляемые указатели, память, выделенная под этот массив в вашей записи, при выполнении New никак не инициализируется, там будут случайные значения. Дальше, если выполнится условие length(parrent^.name)>100, вы эти значения оставляете без изменения, поэтому гарантии, что там будет nil, нет никакой. В итоге проверка if rt=nil даёт отрицательный результат, и вы пытаетесь обратиться к несуществующему узлу по "мусорному" указателю. С большой вероятностью такой указатель указывает на ту часть адресного пространства, в которую ничего не отображено - вот вам и Access Violation.


 
Wito   (2009-11-22 11:55) [7]

2Григорьев Антон спасиба, про parrent^.links[i]:=nil; не подумал
2Остальные: лечите уже свою параною, везде вам кажется что медвежую работу от вас требуют. Я привел код и попросил "помочь" а не выслать готовые иссходники (алгоритм показал в виде кода, расстреляйте меня теперь)



Страницы: 1 вся ветка

Текущий архив: 2010.01.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
2-1258718046
Сергей
2009-11-20 14:54
2010.01.17
Как взять последнее имя папки?


15-1257975014
Юрий
2009-11-12 00:30
2010.01.17
С днем рождения ! 12 ноября 2009 четверг


2-1258916487
Palalord
2009-11-22 22:01
2010.01.17
Проблема с использованием стандартного плеера в Delphi


15-1251621324
NailMan
2009-08-30 12:35
2010.01.17
Зацените видео полета "FPV"


15-1258559898
Korri
2009-11-18 18:58
2010.01.17
Прнцип нанесения водяных знаков