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

Вниз

Вопрос про классы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
14-1133774290
REA
2005-12-05 12:18
2006.01.01
Семинар D2006


14-1133884256
oleggar
2005-12-06 18:50
2006.01.01
добавить поле


2-1134504234
vpavel
2005-12-13 23:03
2006.01.01
В memo загрузить Word документ


1-1133525224
Rule
2005-12-02 15:07
2006.01.01
как отработать события СОМ объекта принадлежащего классу TThread


14-1133779473
k2
2005-12-05 13:44
2006.01.01
Математика для детей.