Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Dynamisches Array - Anfangswert
Christian V. - Sa 14.04.07 13:39
Titel: Dynamisches Array - Anfangswert
Hallo,
Was steht in einem Dynamischen Array drin wenn ich ihn um eins vergrössere? Zufällige Daten?
Muss ich den zuerst noch auf den gewünschten Wert setzten? Oder hat er einen bestimmten Anfangswert?
Arrays sehen so aus:
Array of Array[1..81] of Integer; //Gewünschter Anfangswert: 0
Array of Array[1..9,1..9,1..9] of Boolean; //Gewünschter Anfangswert: false
Roadrunner25 - Sa 14.04.07 13:45
sind dynamische arrays nicht nullbasiert und haben eh den index 0?
HelgeLange - Sa 14.04.07 13:47
das ist aber kein dynamisches array, sondern ein statisches
Willst du alles auf einen Anfangswert setzen, nimmst Du einfach die FillChar Methode :)
Christian V. - Sa 14.04.07 13:48
Ja klar, aber nur dort wo der Dynamisch ist:
Delphi-Quelltext
1: 2: 3: 4:
| DynArray:Array of Array[1..9,1..9,1..9] of Boolean;
setLength(DynArray,1); DynArray[0,1,1,1]:=False; |
@HelgeLange
Ich habe einfach die erste Dimension Dynamisch. Die restlichen will ich immer gleich gross haben.
alzaimar - Sa 14.04.07 13:55
Angeblich sind dynamische Arrays bei der Alloziierung per SetLength initialisiert, d.h. mit $00 belegt. Das stimmt wohl auch, aber ich mache es trotzdem explizit. Ist irgendwie klarer und besser lesbar.
Christian V. - Sa 14.04.07 13:59
alzaimar hat folgendes geschrieben: |
Angeblich...
Das stimmt wohl auch... |
Und was heist das jetzt konkret? :D
Frage nebenbei, wie werden true und false gespeichert? $FF und $00?
HelgeLange - Sa 14.04.07 14:02
Ich sage ja, FillChar
alzaimar - Mo 16.04.07 08:33
Christian V. hat folgendes geschrieben: |
alzaimar hat folgendes geschrieben: | Angeblich...
Das stimmt wohl auch... |
Und was heist das jetzt konkret? :D |
Konkret heißt das, das ein Setlength angeblich den alloziierten Speicherbereich mit Nullen füllt, und das das wohl auch so stimmt. :rofl:
Christian V. hat folgendes geschrieben: |
| Frage nebenbei, wie werden true und false gespeichert? $FF und $00? |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| {$APPTYPE CONSOLE} Var B : Boolean; I : Byte Absolute B;
Begin B := True; Writeln ('True = ',IntToHex (I)); B := False; Writeln ('False = ',IntToHex (I)); End; |
Merke: Delphi kann auch Fragen beantworten. :zwinker:
Kroko - Mo 16.04.07 12:48
HelgeLange hat folgendes geschrieben: |
| Ich sage ja, FillChar |
Geht nur bei 0 als Anfangswert, alle anderen Werte muss mann über eine Schleife füllen!
HelgeLange - Mo 16.04.07 13:20
Delphi-Quelltext
1:
| FillChar(P^, MyArraySize, 1); |
geht bei mir auch mit 1 :P
Du meintest vielelicht ZeroMemory
alzaimar - Mo 16.04.07 13:35
Helge, was passiert, wenn das Array aus Cardinals passiert? Wird dann überall ne $00000001 reingeschrieben, oder eher $01010101?
Kroko - Mo 16.04.07 13:36
wenn P array of Integer ist????????? (s.o.)
HelgeLange - Mo 16.04.07 13:37
Naja, es fillchar ;)
Kroko - Mo 16.04.07 13:38
alzaimar hat folgendes geschrieben: |
Christian V. hat folgendes geschrieben: | alzaimar hat folgendes geschrieben: | Angeblich...
Das stimmt wohl auch... |
Und was heist das jetzt konkret? :D |
Konkret heißt das, das ein Setlength angeblich den alloziierten Speicherbereich mit Nullen füllt, und das das wohl auch so stimmt. :rofl:
... |
SetLength füllt den Bereich
nicht mit Nullen (Test mit TurboD):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var A: array of Integer; begin Setlength(A,8); A[0] := 2; A[7] := 7; ShowMessage(IntTostr(A[0])+','+IntTostr(A[7])); Setlength(A,9); ShowMessage(IntTostr(A[0])+','+IntTostr(A[7])); end; |
Christian V. - Mo 16.04.07 15:10
Danke für die Zahlreichen antworten, ich werde mir die FillChar Funktion mal ansehen, die kenn ich nämlich noch nicht.
Fazit: Zur Sicherheit einfach mal mit dem gewünschten Wert manuell initialisieren, oder?
Stefan.Buchholtz - Mo 16.04.07 16:45
Ein Blick in die Delphi Hilfe reicht:
| Zitat: |
| Bei einer langen String- oder einer dynamischen Array-Variable weist SetLength dem in S referenzierten String oder Array die angegebene Länge zu. Dabei bleiben die Zeichen im String oder die Elemente im Array erhalten, jedoch ist der Inhalt des neu zugewiesenen Speicherbereichs nicht definiert. Eine Ausnahme stellt das Vergrößern der Länge von dynamischen Arrays dar, in dem die Elemente Typen sind, die initialisiert werden müssen (Strings, Varianten, Variant-Arrays oder Records, die solche Typen enthalten). Wenn S ein dynamisches Typen-Array ist, das initialisiert werden muss, wird der neu zugewiesene Platz auf 0 oder nil gesetzt. |
Ein
array of String wird also initialisiert, ein
array of Integer nicht. Wenn du ein existierendes Array vergrößerst, bleibt der vorherige Inhalt erhalten, es werden in jedem Fall nur die neuen Elemente initialisiert - dein Beispiel würde also mit jedem Array-Typ das selbe Ergebnis bringen.
Stefan
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!