Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamisches Array verkleinern (https://www.delphipraxis.net/98451-dynamisches-array-verkleinern.html)

dominikkv 27. Aug 2007 16:29


Dynamisches Array verkleinern
 
Hi

ich hab ein dynamisches Array:
Delphi-Quellcode:
var DynArray: Array of Integer;
Um Werte reinzuschreiben muss ich erst einmal eine Länge setzen:
Delphi-Quellcode:
SetLength(DynArray, 20);
Wenn ich das Array vergrößern will rufe ich einfach nochmal SetLength auf:
Delphi-Quellcode:
SetLength(DynArray, 35);
Ich habe bisher, um das Array wieder zu verkleinern, wieder SetLength aufgerufen, mit einem kleineren Wert.
Nun lese ich:
Zitat:

Zitat von Markt&Technik: Jetzt lerne ich Delphi
Um das Array zu verkleinern, muss jedoch die Copy-Funktion benutzt werden...

Um das Array zu verkleiner müsste ich nun folgendes machen:
Delphi-Quellcode:
DynArray := Copy(DynArray, 0, 10);
Und nun zu meiner Frage:
Kann ich das auch mit SetLength machen oder hab ich dann ein Speicher-Leak?
Ich müsste dann nämlich alle bisherigen Projekte umschreiben^^

mfg.Dominik

marabu 27. Aug 2007 16:38

Re: Dynamisches Array verkleinern
 
Hallo Dominik,

du wirst das eventuell untersuchen müssen, denn Borland schreibt zum Thema dynamische Arrays etwas anderes:

... Um ein dynamisches Array abzuschneiden, übergeben Sie es an SetLength oder Copy und weisen das Ergebnis wieder der Array-Variablen zu. Die Prozedur SetLength ist normalerweise schneller. ...

Vergrößern geht nur mit SetLength(), verkleinern auch mit Copy() und automatischer Freigabe des Originals.

Grüße vom marabu

sirius 27. Aug 2007 16:39

Re: Dynamisches Array verkleinern
 
Ist mir auch.

Intern wird Reallocmem aufgerufen und damit dürften keine Speicherprobleme auftreten.
Auch ein Blick ins CPU-Fenster bei einem Test zeigt, dass der Memorymanager eingreift und das Array kürzt.

pstruh 27. Aug 2007 16:44

Re: Dynamisches Array verkleinern
 
Hallo Dominik,
ich verwende in meinen Programmen immer (und ohne Probleme)...
Delphi-Quellcode:
 SetLength(MyArray,High(MyArray)+2)
zum vergrößern, und
Delphi-Quellcode:
SetLength(MyArray,High(MyArray)
zum verkleinern.

Aber nun auch von mir eine Frage, die meine Unkenntnis der tieferen Vorgänge in Delphi offenbart: Ist es notwendig am Programmende das dynamische Array mit
Delphi-Quellcode:
MyArray:=nil
wieder zu dereferenzieren - oder ist das völlig überflüssig, da das Programm mit seiner Beendigung (automatisch) alles aus dem Speicher entfernt?
Gruß

dominikkv 27. Aug 2007 17:18

Re: Dynamisches Array verkleinern
 
Ok, Danke für eure Antworten :cheers:

Dann ist SetLength ja sogar besser als Copy...
Da kommt mir so manches ein bisschen komisch vor was in diesem Buch steht^^

Zitat:

Zitat von pstruh
Aber nun auch von mir eine Frage, die meine Unkenntnis der tieferen Vorgänge in Delphi offenbart: Ist es notwendig am Programmende das dynamische Array mit
Delphi-Quellcode:
MyArray:=nil
wieder zu dereferenzieren - oder ist das völlig überflüssig, da das Programm mit seiner Beendigung (automatisch) alles aus dem Speicher entfernt?
Gruß

Wenn du das Programm komplett beendest wird eh der ganze Speicher wieder freigegeben...
Und wenn du den Speicher zur Laufzeit freigeben willst einfach (wie wir grad gelernt haben^^) Setlength(MyArray, 0); aufrufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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