Форум: "Основная";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];
ВнизВопрос про классы Найти похожие ветки
← →
Piero (2005-12-02 10:40) [0]есть 2 класс
TBranch = class
private
level : integer;
...
PBr = ^TBranch;
PTBranches = array of PBr;
TTree = class
protected
PBranches : PTBranches;
....
m : TTree;
Делаю так :
var b : TBranch;
b:=TBranch.Create;
b.level:=1;
setlength(PBranches,1);
//new(PBranches[0]);
PBranches[0]:=@b;
В массиве PBranches[0].level - запоминается 1, но при следующих операциях, там оказывается мусор (какие-другие числа), я так понимаю нужно где-то рамотно выделять память, или нет, где ошибка?
← →
Piero (2005-12-02 10:42) [1]Да еще забыл
constructor TBranch.Create;
begin
inherited Create;
L :=5;
....
end;
constructor TTree.Create;
var p : Pointer;
begin
inherited Create;
...
end;
← →
Lamer@fools.ua © (2005-12-02 10:54) [2]>В массиве PBranches[0].level - запоминается 1, но при следующих операциях, там оказывается мусор (какие-другие числа), я так понимаю нужно где-то рамотно выделять память, или нет, где ошибка?
Нужно учить матчасть. В частности о том, что "b" из "var b : TBranch" - это указатель на экземпляр класса и поэтому "PBr = ^TBranch" вообще непонятно кому надо.
← →
Piero (2005-12-02 11:00) [3]Спасибо я понял, надо так
TTree = class
protected
PBranches : array of TBranch;
...
PBranches[0]:=b;
← →
Piero (2005-12-02 15:36) [4]А вот еще один вопрос созрел,
когда я создаю
p : TBranch в процедуре, а затем выхожу из неё, при выходе, получаю ошибку памяти:
project... raised exception class EAccessViolation with message "Access violation".....
, что я должен писать в TBranch.Destroy, или дело не в этом?
TBranch = class
protected
L : byte;
direction : smallint;
sum : word;
path : array of Txy;
level : integer;
Num : integer;
.....
← →
Леон © (2005-12-02 15:49) [5]имхо,
PBranches[0]:=TBranch.create();
PBranches[0]....
в destructor"е TTree:
PBranches[0].free;
спасет
← →
Леон © (2005-12-02 15:52) [6]или PBranches[0]^:=TBranch.create(); //сейчас что то не врублюсь...
← →
Piero (2005-12-02 16:01) [7]а причем здесь destructor Ttree; я же не уничтожаю экземпляр Ttree, только одну ветвь хочу уничтожить.
← →
Piero (2005-12-02 16:04) [8]А если
TBranch = class
какой смысл в конструкторе будет иметь inherited Create ?
← →
Digitman © (2005-12-02 16:13) [9]
> какой смысл
а какой смысл юзать дин.массив, если Борланд для таких задач придумал и дал тебе TObjectList ?
← →
vecna © (2005-12-02 16:14) [10]2Piero
расскажи, что за задачу ты решаешь?
← →
Piero (2005-12-02 16:20) [11]происходит поиск решения в виде дерева - количество ветвей все время увеличивается, каждая ветка на 1м ходе превращается в M-ветвей,
я придумал 2 объекта
1 - ветка
2 - дерево
В дереве кроме ветвей есть еще много чего, параметры поиска и т.д.
А проблемма на данный момент такая, когда в процедуре связанной с деревом я объявляю еще и объекты тапи ветвь (в само дерево их не включаю) и при выходе из процедуры получаю ошибку памяти...
← →
Piero (2005-12-02 16:23) [12]Digitman © , TObjectList это хорошо, даже сортировка есть,.... может и исправлю....
← →
Digitman © (2005-12-02 16:24) [13]
> Piero (02.12.05 16:20) [11]
чем тебе TCustomTreeView не угодил ?
велосипед изобретаешь ?
← →
Piero (2005-12-02 16:27) [14]Digitman © , а возможно вообще говоря оценить на сколько TObjectList, будет медленнее или быстрее работать, т.к. у меня это должно очень быстро считаться ветвей очень много будет, дин. массив это самое простое как я понимаю, наверное и самое быстрое
← →
Digitman © (2005-12-02 16:36) [15]
> Piero (02.12.05 16:27) [14]
> дин. массив это самое простое как я понимаю, наверное и
> самое быстрое
где аргументы ?
← →
Piero (2005-12-02 16:49) [16]Ну то что TObjectList, будет памяти больше жрать это и так понятно?
а с памятью там тоже критично, комп будет очень слабый,
а на вопрос можете ответить
procedure TTree.DoOneStep;
var p : Txy;
BrRes : TBranches;
ang : word;
i,i1,mm: integer;
xt,yt : double;
k : byte;
BrNew : TBranches;
begin
setlength(Result,NumB-1);
setlength(BrRes,NumB-1);
p:=Branches[0].GetLastPoint;
ang:=AddToAngle(Branches[0].direction,fi);
for i:=0 to NumB-1 do
begin
....
BrRes[i]:=TBranch.Create;
for i1:=0 to branches[0].level do BrRes[i].path[i1]:=Branches[0].path[i1];
BrRes[i].AddPoint(result[i].x,result[i].y);
это кусок
здесь я создаю ветви, но даже не вношу их в дерево, откуда ошибка памяти?
BrRes:=nil; - не помагает
← →
Digitman © (2005-12-02 16:55) [17]
> Ну то что TObjectList, будет памяти больше жрать это и так
> понятно?
мне - нет.
потому и желаю услышать аргументы в пользу подобных утверждений ..
← →
Piero (2005-12-02 16:57) [18]Вот покороче
procedure TTree.DoOneStep;
var BrRes : TBranches;
begin
setlength(BrRes,1);
BrRes[i]:=TBranch.Create;
end;
при выходе из процедуры появляется ошибка памяти
когда происходит выход из процедуры, вызывается ли destructor TBranch, автоматически?
← →
Anatoly Podgoretsky © (2005-12-02 16:59) [19]Piero (02.12.05 16:57) [18]
Не вызывается.
← →
Piero (2005-12-02 17:03) [20]Ладно ничего не отвечайте, я сам запутался
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.014 c