![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про классы
Piero © (2005-12-02 10:40:00)есть 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 17:03:00) [1]Ладно ничего не отвечайте, я сам запутался
Anatoly Podgoretsky (2005-12-02 16:59:00) [2]Piero (02.12.05 16:57) [18]
Не вызывается.
Piero (2005-12-02 16:57:00) [3]Вот покороче
procedure TTree.DoOneStep;
var BrRes : TBranches;
begin
setlength(BrRes,1);
BrRes[i]:=TBranch.Create;
end;
при выходе из процедуры появляется ошибка памяти
когда происходит выход из процедуры, вызывается ли destructor TBranch, автоматически?
Digitman (2005-12-02 16:55:00) [4]
> Ну то что TObjectList, будет памяти больше жрать это и так
> понятно?
мне - нет.
потому и желаю услышать аргументы в пользу подобных утверждений ..
Piero (2005-12-02 16:49:00) [5]Ну то что 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:36:00) [6]
> Piero (02.12.05 16:27) [14]
> дин. массив это самое простое как я понимаю, наверное и
> самое быстрое
где аргументы ?
Piero (2005-12-02 16:27:00) [7]Digitman © , а возможно вообще говоря оценить на сколько TObjectList, будет медленнее или быстрее работать, т.к. у меня это должно очень быстро считаться ветвей очень много будет, дин. массив это самое простое как я понимаю, наверное и самое быстрое
Digitman (2005-12-02 16:24:00) [8]
> Piero (02.12.05 16:20) [11]
чем тебе TCustomTreeView не угодил ?
велосипед изобретаешь ?
Piero (2005-12-02 16:23:00) [9]Digitman © , TObjectList это хорошо, даже сортировка есть,.... может и исправлю....
Piero (2005-12-02 16:20:00) [10]происходит поиск решения в виде дерева - количество ветвей все время увеличивается, каждая ветка на 1м ходе превращается в M-ветвей,
я придумал 2 объекта
1 - ветка
2 - дерево
В дереве кроме ветвей есть еще много чего, параметры поиска и т.д.
А проблемма на данный момент такая, когда в процедуре связанной с деревом я объявляю еще и объекты тапи ветвь (в само дерево их не включаю) и при выходе из процедуры получаю ошибку памяти...
vecna (2005-12-02 16:14:00) [11]2Piero
расскажи, что за задачу ты решаешь?
Digitman (2005-12-02 16:13:00) [12]
> какой смысл
а какой смысл юзать дин.массив, если Борланд для таких задач придумал и дал тебе TObjectList ?
Piero (2005-12-02 16:04:00) [13]А если
TBranch = class
какой смысл в конструкторе будет иметь inherited Create ?
Piero (2005-12-02 16:01:00) [14]а причем здесь destructor Ttree; я же не уничтожаю экземпляр Ttree, только одну ветвь хочу уничтожить.
Леон (2005-12-02 15:52:00) [15]или PBranches[0]^:=TBranch.create(); //сейчас что то не врублюсь...
Леон (2005-12-02 15:49:00) [16]имхо,
PBranches[0]:=TBranch.create();
PBranches[0]....
в destructor'е TTree:
PBranches[0].free;
спасет
Piero (2005-12-02 15:36:00) [17]А вот еще один вопрос созрел,
когда я создаю
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;
.....
Piero (2005-12-02 11:00:00) [18]Спасибо я понял, надо так
TTree = class
protected
PBranches : array of TBranch;
...
PBranches[0]:=b;
Lamer@fools.ua (2005-12-02 10:54:00) [19]> В массиве PBranches[0].level - запоминается 1, но при следующих операциях, там оказывается мусор (какие-другие числа), я так понимаю нужно где-то рамотно выделять память, или нет, где ошибка?
Нужно учить матчасть. В частности о том, что "b" из "var b : TBranch" - это указатель на экземпляр класса и поэтому "PBr = ^TBranch" вообще непонятно кому надо.
Piero (2005-12-02 10:42:00) [20]Да еще забыл
constructor TBranch.Create;
begin
inherited Create;
L :=5;
....
end;
constructor TTree.Create;
var p : Pointer;
begin
inherited Create;
...
end;