Autor Beitrag
Christian V.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 311

Win Xp Prof
Turbo Delphi 2005
BeitragVerfasst: Sa 14.04.07 14:39 
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

_________________
Hardware runs the world, software controls the hardware, code generates software - Have You already coded today?
Roadrunner25
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89

Win XP
D7
BeitragVerfasst: Sa 14.04.07 14:45 
sind dynamische arrays nicht nullbasiert und haben eh den index 0?
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Sa 14.04.07 14:47 
das ist aber kein dynamisches array, sondern ein statisches
Willst du alles auf einen Anfangswert setzen, nimmst Du einfach die FillChar Methode :)

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
Christian V. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 311

Win Xp Prof
Turbo Delphi 2005
BeitragVerfasst: Sa 14.04.07 14:48 
Ja klar, aber nur dort wo der Dynamisch ist:
ausblenden 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.

_________________
Hardware runs the world, software controls the hardware, code generates software - Have You already coded today?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Sa 14.04.07 14: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.

_________________
Na denn, dann. Bis dann, denn.
Christian V. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 311

Win Xp Prof
Turbo Delphi 2005
BeitragVerfasst: Sa 14.04.07 14: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?

_________________
Hardware runs the world, software controls the hardware, code generates software - Have You already coded today?
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Sa 14.04.07 15:02 
Ich sage ja, FillChar

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 16.04.07 09: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?



ausblenden 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:

_________________
Na denn, dann. Bis dann, denn.
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mo 16.04.07 13: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!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Mo 16.04.07 14:20 
ausblenden Delphi-Quelltext
1:
FillChar(P^, MyArraySize, 1);					

geht bei mir auch mit 1 :P

Du meintest vielelicht ZeroMemory

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 16.04.07 14:35 
Helge, was passiert, wenn das Array aus Cardinals passiert? Wird dann überall ne $00000001 reingeschrieben, oder eher $01010101?

_________________
Na denn, dann. Bis dann, denn.
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mo 16.04.07 14:36 
wenn P array of Integer ist????????? (s.o.)

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Mo 16.04.07 14:37 
Naja, es fillchar ;)

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mo 16.04.07 14: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):
ausblenden 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;

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Christian V. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 311

Win Xp Prof
Turbo Delphi 2005
BeitragVerfasst: Mo 16.04.07 16: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):
ausblenden 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?

_________________
Hardware runs the world, software controls the hardware, code generates software - Have You already coded today?
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mo 16.04.07 17: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

_________________
Ein Computer ohne Windows ist wie eine Schokoladentorte ohne Senf.