Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про классы


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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо