Главная страница
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.015 c
3-1233213892
Ruslan777
2009-01-29 10:24
2010.01.17
Клиент серверное приложение!


15-1258234144
Kerk
2009-11-15 00:29
2010.01.17
Посоветуйте какую-нибудь хорошую фантастику


15-1258526556
ZeroDivide
2009-11-18 09:42
2010.01.17
Исключить упоминание о боге из гимна


2-1259003015
AndrewGj
2009-11-23 22:03
2010.01.17
MsWord


15-1257802926
DVM
2009-11-10 00:42
2010.01.17
Забавный ролик с Гейтсом и Балмером