Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi new() bei array of record? (https://www.delphipraxis.net/150146-new-bei-array-record.html)

supermuckl 8. Apr 2010 15:36


new() bei array of record?
 
hi all
ich drück mich eigentlich immer um fragen die eigentlich so einfach sind aber irgendwie bin ich mir nach langem suchen immer noch nicht im klaren ob das was ich vor hab nun ohne oder mit new / dispose gemacht werden muss

ich habe sowas:

Delphi-Quellcode:
  type Tflaeche = record
  data1,data2:string[100];
  top:integer;
  bottom :integer;
  left:integer;
  right:integer;
  end;

  Tclicklist = array of array of Tflaeche;
und möchte da jetzt dieses array of array mit daten füllen
muss ich da jetzt new() benutzen? oder macht das delphi schon im hintergrund wie mit array of string?
klar das ich das array nach benutzung wieder mit setlength(0) kürzen muss um kein speicherleck zu verursachen..
aber auch hier die frage - reicht es ein setlenght(bla,0) auf das "root" array zu machen oder muss ich - weil es ja 2dimensional ist, jedes unterarray auch auf länge 0 setzen?

ich würde da jetzt so vorgehen, um meine clickliste zu instanzieren:

Delphi-Quellcode:
var list:Tclicklist;

setlength(list,chart.SeriesCount);
for s := 0 to high(list) do begin
    setlength(list[s],chart.Series[s].Count);
    for c := 0 to high(list[s]) do new(list[s,c]);
end;
1. kann ich mir das new() jetzt sparen?

2. muss ich nacher pro ebene setlength() machen beim array freigeben? oder reichts aufs root-array?

mkinzler 8. Apr 2010 15:43

Re: new() bei array of record?
 
Es handelt sich ja um einen dynamischen Array. Deshalb muss er mit SetLength() dimensioniert werden

Neutral General 8. Apr 2010 15:45

Re: new() bei array of record?
 
New() dürfte eigentlich gar nicht funktionieren..

Nachher beim freigeben musst du soweit ich weiß nur das übergeordnete Array auf die Länge 0 setzen. Also:

Delphi-Quellcode:
SetLength(list,0);

himitsu 8. Apr 2010 15:47

Re: new() bei array of record?
 
Strings und dynamische Arrays => SetLength
Pointer mit zusätzlicher Initialisierung => New + Dispose
Pointer ohne alles => z.B. GetMem und FreeMem
Objekte => .Create + .Free

Ist doch eigentlich recht einfach/verständlich?


Zitat:

Zitat von Neutral General
Nachher beim freigeben musst du soweit ich weiß nur das übergeordnete Array auf die Länge 0 setzen.

ist theoretisch möglich, aber Delphi gibt dyn. Arrays ja eh automatisch frei.

supermuckl 8. Apr 2010 16:31

Re: new() bei array of record?
 
naja das dynamische array soll ja nicht nur in einer funktion "leben" sondern in einer session (intraweb) instanziert bleiben
von daher muss ichs irgendwo mit setlength() dimensionieren und dann wieder wenn die session geclosed wird wieder auf 0 setzen

was wäre jetzt ein beispiel mit new() dispose() ?
kann dem nicht ganz folgen weil du schreibst:

Strings und dynamische Arrays => SetLength
Pointer mit zusätzlicher Initialisierung => New + Dispose

und da ja dynamische arrays auch nur pointer sind kapier ich grad nicht wieso du das hier separierst?!
wann brauch ich eine zusätzliche initialisierung und wie sieht das an einem beispiel aus?

mkinzler 8. Apr 2010 16:35

Re: new() bei array of record?
 
Bespiel mit new

Delphi-Quellcode:
type
  PLäaeche = ^TFlaeche;
  Tflaeche = record
    data1,data2:string[100];
    top:integer;
    bottom :integer;
    left:integer;
    right:integer;
  end;
...
var
   flaeche: Pflaeche;
...
    new( flaeche);
...

DeddyH 8. Apr 2010 16:36

Re: new() bei array of record?
 
Ja, das ist ja auch ein typisierter Pointer. Wie bereits gesagt wurde, glaube ich nicht, dass New() bei dynamischen Arrays überhaupt kompiliert.

himitsu 8. Apr 2010 16:39

Re: new() bei array of record?
 
Ein dyn. Array bestitzt nur intern einen Zeiger,
aber es ist semantisch kein Pointer.

Delphi-Quellcode:
Tclicklist = array of array of Tflaeche;
Pclicklist = ^Tclicklist;
Pclicklist = Pointer
Tclicklist = dyn. Array


New gilt nur für typisierte Zeiger (also irgendwelche semantischen Zeiger auf irgendwas ... der untypisierte Delphi-Referenz durchsuchenPointer geht da auch nicht)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz