Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Arrays initialisieren


mars - Sa 22.02.03 18:39
Titel: Arrays initialisieren
Hallo

Ganz kurze Frage:
Ist es Zufall, dass bei mir Arrays ohne Initialisierung immer 0 sind?


AndyB - Sa 22.02.03 18:41

Nein, das ist kein Zufall.


Christian S. - Sa 22.02.03 19:25

Ne, die Länge eines dynamischen Arrays ist immer erst einmal Null. Grundlagen zu Arrays findest Du auch hier [http://www.delphi-forum.de/viewtopic.php?t=7204].

MfG,
Peter


mars - Sa 22.02.03 23:06

Peter Lustig hat folgendes geschrieben:
Ne, die Länge eines dynamischen Arrays ist immer erst einmal Null. Grundlagen zu Arrays findest Du auch hier [http://www.delphi-forum.de/viewtopic.php?t=7204].

MfG,
Peter



gemeint war nicht die Länge, sondern der Wert. Und zwar tritt der Effekt bei dynamischen und statischen Arrays auf...


AndyB - Sa 22.02.03 23:31

So lange du die statischen Arrays nicht lokal deklarierst (in Prozeduren und Funktionen), werden sie immer mit 0 initialisiert. Die Elemete einer dynamischen Arrays hingegen sind immer auf 0 gesetzt, wenn mit SetLength() die Länge verändert wird.


Raphael O. - Sa 22.02.03 23:47

Ich fänds praktisch, wenn man ganze Arrays mit einem Wert initialisieren könnte...
z.B. so:

Quelltext
1:
myarray:=2;                    

dann hätten alle Werte aus MyArray den Wert 2

Naja man kann halt nicht alles haben...

ist ja immerhin schon etwas, dass automatisch alle globalen Arrays 0 als Wert haben...

Fiji-Fighter


BungeeBug - So 23.02.03 09:36

auch das geht ...

Code berichtig!!

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 
Procedure xxx.xxx
 VAR
   i : integer ; // i := laufwariable
   MyArray : Array of integer;
BEGIN 
 SetLength(MyArray,9) // <- Länge des Arrays
 FOR i := 0  TO High(MyArray) DO
  BEGIN
   MyArray[i] := 2; // <- Hier den Wunschwert angeben
  END;
END;


so sollte das gehn ... is zwar nicht gerade elegant aber es geht (hoffentlich, der Code is NICHT getestet)

MfG BungeeBug


AndyB - So 23.02.03 10:51

BungeeBug hat folgendes geschrieben:
hoffentlich, der Code is NICHT getestet

Ich muss dich enttäuschen, denn dein Code produziert eine Access Violation. Du musst das Length() durch High() ersetzen oder ein -1 an das Length() anhängen.


mars - So 23.02.03 10:51

AndyB hat folgendes geschrieben:
So lange du die statischen Arrays nicht lokal deklarierst (in Prozeduren und Funktionen), werden sie immer mit 0 initialisiert. Die Elemete einer dynamischen Arrays hingegen sind immer auf 0 gesetzt, wenn mit SetLength() die Länge verändert wird.


Danke. Das war meine gesuchte Antwort! Bisher hatte ich diese Arrays - wie BungeeBug es beschreibt - in einer Schleife auf 0 gesetzt, bis ichs einmal vergass und sich nichts veränderte... :wink:


BungeeBug - So 23.02.03 13:51

AndyB hat folgendes geschrieben:
BungeeBug hat folgendes geschrieben:
hoffentlich, der Code is NICHT getestet

Ich muss dich enttäuschen, denn dein Code produziert eine Access Violation. Du musst das Length() durch High() ersetzen oder ein -1 an das Length() anhängen.


Ich war mir schon beim schreiben nich ganz sicher ob jetzt Length() oder High() ... naja ich hab mich dann für Length() entschieden :( ...

MfG BungeeBug


Jack Falworth - Mo 24.02.03 15:36

ich glaub was ihr sucht, ist das hier (jedenfalls für Char und Byte):

procedure FillChar(var X; Count: Integer; Value: Byte)

hier ein kleines bsp:


Quelltext
1:
2:
3:
4:
5:
var s: array[0..9] of char;
begin
  { Alles mit 2-en füllen }
  FillChar(s, SizeOf(s), 2);
end;