AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

new() bei array of record?

Ein Thema von supermuckl · begonnen am 8. Apr 2010 · letzter Beitrag vom 8. Apr 2010
Antwort Antwort
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#1

new() bei array of record?

  Alt 8. Apr 2010, 15:36
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?
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: new() bei array of record?

  Alt 8. Apr 2010, 15:43
Es handelt sich ja um einen dynamischen Array. Deshalb muss er mit SetLength() dimensioniert werden
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: new() bei array of record?

  Alt 8. Apr 2010, 15:45
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:

SetLength(list,0);
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#4

Re: new() bei array of record?

  Alt 8. Apr 2010, 15:47
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 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#5

Re: new() bei array of record?

  Alt 8. Apr 2010, 16:31
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?
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: new() bei array of record?

  Alt 8. Apr 2010, 16:35
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);
...
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: new() bei array of record?

  Alt 8. Apr 2010, 16:36
Ja, das ist ja auch ein typisierter Pointer. Wie bereits gesagt wurde, glaube ich nicht, dass New() bei dynamischen Arrays überhaupt kompiliert.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#8

Re: new() bei array of record?

  Alt 8. Apr 2010, 16:39
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz