![]() |
Dynamische Array-Variable freigeben (ARRAY OF BOOLEAN)
Hi, 8)
Delphi (5) F1: (...) „ Dynamische Array-Variablen sind implizit Zeiger und werden mit derselben Referenzzählung verwaltet wie lange Strings. Um ein dynamisches Array freizugeben, weisen Sie einer Variablen, die das Array referenziert, den Wert nil zu, oder Sie übergeben die Variable an Finalize. Beide Methoden geben das Array unter der Voraussetzung frei, daß keine weiteren Referenzen darauf vorhanden sind. Wenden Sie auf dynamische Array-Variablen nicht den Derefenzierungsoperator (^) an, und übergeben Sie sie auch nicht an die Prozeduren New oder Dispose.“ (...) So... [code:1:8deeee572a] TYPE |
Ich habe mich erst gewundert, ob das vielleicht ein FAQ werden soll, da ich die Herkunft D5 F1 nicht gleich kappiert habe :mrgreen:
mit
Code:
hast Du erst einmal einen neuen Variablentyp deklariert. Anschließend musst Du noch eine Variable dieses Types deklarieren
TYPE
ArrayOfBoolean = ARRAY OF Boolean;
Code:
var
BooleanArray: ArrayOfBoolean; begin .... SetLength(BooleanArray, 5]; BooleanArray[0] := False; BooleanArray[1] := True; BooleanArray[2] := False; ... BooleanArray := nil; // oder - ich mache es immer wie folgt SetLength(BooleanArray, 0); end; |
Natürlich Sakura,
es sollte heißen: [code:1:5ab5fd732d] TYPE |
Nutze einfach das
Code:
Beispiel. Den Rest übernimmt Delphi dann automatisch.
SetLength(BooleanArray, 0);
|
Bei mir funktioniert das aber unter D5 und D6.
Code:
type
ArrayOfString = array of string; ArrayOfBoolean = array of Boolean; procedure TForm1.Button1Click(Sender: TObject); var a: ArrayOfString; b: ArrayOfBoolean; begin a := nil; b := nil; end; |
Hi Sakura, 8)
ok... so mache is es...hat mich bloß gewundert das es mit NIL nicht klappt... Na..ja ... auf Dich ist wie immer Verlaß... Besten DANK Paul Jr. |
Weisst Du, warum ich nicht die Deutsche Delphi Version nutze? Wegen der schlecht übersetzten Hilfe. Hier das Original
Zitat:
|
Ach so... mein Problem aber ist...das ich es später mit
IF a = NIL THEN dieses Wert abfrage... was schlägst Du jetzt vor...? Gruß Paul Jr. |
if Length(a) = 0 then ...
|
Hi Leute,
jetzt sehe ich (in Englisch,he,he)... Danke jbg ... Danke Sakura Gruß Paul Jr. |
Zu spät... Siehe jbg
|
Re: Dynamische Array-Variable freigeben (ARRAY OF BOOLEAN)
Hatte jetzt auch ein nettes Problem damit.
Ich habe bis jetzt die dynamischen Arrays immer mit setlength(a,0) freigegeben. Dabei war ich mir nicht sicher, ob damit wirklich alles freigegeben wird. Also auch in die Hilfe geschaut und dann mit finalize(a) freigegeben. Nun gabs aber bei einigen Projekten den internen Fehler L470! a:=nil funktioniert. Jetzt frag ich mich noch ist mit a:=nil wirklich alles freigegeben, oder muss ich vorher doch noch setlength benutzen? Gruß BBB |
Re: Dynamische Array-Variable freigeben (ARRAY OF BOOLEAN)
Das sollte Dir FastMM verraten können. Ich vermute aber, dass das SetLength() notwendig ist.
|
Re: Dynamische Array-Variable freigeben (ARRAY OF BOOLEAN)
SetLength(X, 0) leitet den Aufruf an DynArrayClear weiter und dieses gibt das Array frei.
Delphi-Quellcode:
(DynArraySetLength ist die interne Funktion von SetLength bei einem dynamischen Array)
procedure DynArraySetLength(var a: Pointer; typeInfo: Pointer; dimCnt: Longint; lengthVec: PLongint);
... begin p := a; // Fetch the new length of the array in this dimension, and the old length newLength := PLongint(lengthVec)^; if newLength <= 0 then begin if newLength < 0 then Error(reRangeError); DynArrayClear(a, typeInfo); exit; end; ... X := nil; ruft bei dynamischen Arrays direkt das DynArrayClear auf, ohne Umweg über SetLength. (Compiler-Magic ist doch was Tolles :mrgreen: ) PS: sobald ein dyn. Array nicht mehr benötigt wird, gibt Delphi dieses automatisch frei. (also bei einer lokalen Array-Variable geschieht das in dem Code, welcher sich quasi im end; der Prozedur versteckt) PS: fehlen eigentlich nur bei mir große Teile von Beitrag #1 und #3? |
Re: Dynamische Array-Variable freigeben (ARRAY OF BOOLEAN)
Ok, also kann man nach eigenem Gusto entscheiden...
Prima, danke! |
Re: Dynamische Array-Variable freigeben (ARRAY OF BOOLEAN)
Jupp, kann man.
Ich laß es fast immer automatisch freigeben (Delphi kümmert sich schon drum ... ist quasie genauso, wie mit den Stringvariablen), außer wenn bei Globalen, Klassenvariablen oder innerhalb einer Prozedur dieses einmal, wärend der "Lebenszeit" des Arrays, nötig sein sollte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 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