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..9of 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

user profile iconalzaimar 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

user profile iconChristian V. hat folgendes geschrieben:
user profile iconalzaimar 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:

user profile iconChristian 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

user profile iconHelgeLange 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

user profile iconalzaimar hat folgendes geschrieben:
user profile iconChristian V. hat folgendes geschrieben:
user profile iconalzaimar 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.
user profile iconKroko hat folgendes geschrieben:
user profile iconalzaimar hat folgendes geschrieben:
user profile iconChristian V. hat folgendes geschrieben:
user profile iconalzaimar 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;


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