Bitte erleuchtet mich.
Recherche brachte keine brauchbare Ergebnisse.
Ich initialisiere ein Array:
Setlength(meinarray?,0);
und erhalte bei
l := length(meinarray)
als Ergebnis l = 1.
Warum 1 und nicht 0?
Was verstehe ich bei setlength bzw length nicht?
Verständnisproblem bei der Länge von Arrays
- kpmais
- Beiträge: 42
- Registriert: Di 26. Mai 2020, 08:51
- OS, Lazarus, FPC: Winux (L 2.0.12, FPC 3.2.0; Debian/Win7)
- CPU-Target: x86-64
- Wohnort: Saarlouis/Saarland
Re: Verständnisproblem bei der Länge von Arrays
Das ? hinter meinarray ist ein Schreibfehler.
Re: Verständnisproblem bei der Länge von Arrays
Length bzw. das, was du mit SetLength() festlegst, ist die Anzahl der Elemente. Weil die Index-Zählung mit 0 beginnt, ist das dann aber nicht der letzte Index, dieser ist um 1 kleiner als Length. Mache dir das mit einem Beispiel klar: Ein dynamisches Array mit 3 Elementen hat die Elemente 0, 1, 2.
Wenn du den höchsten Index brauchst, nimm die Funktion High(array) (statt Length(array)-1). Es gibt auch noch Low(array) - das gibt den niedrigsten Index zurück (ist allerdings bei dynamischen Arrays immer null, kann aber auch bei statischen Arrays benutzt werden: z.B. Jahr: array[1900..2100] --> Low(Jahr) = 1900, High(Jahr) = 2100).
Widerstehe der Versuchung, ein dynamisches Array erst ab Index 1 zu nutzen - denn du musst jedesmal nachdenken, wieviele Elemente wirklich existieren. Dynamische Arrays beginnen mit Index 0 - aus, Amen.
Wenn du den höchsten Index brauchst, nimm die Funktion High(array) (statt Length(array)-1). Es gibt auch noch Low(array) - das gibt den niedrigsten Index zurück (ist allerdings bei dynamischen Arrays immer null, kann aber auch bei statischen Arrays benutzt werden: z.B. Jahr: array[1900..2100] --> Low(Jahr) = 1900, High(Jahr) = 2100).
Widerstehe der Versuchung, ein dynamisches Array erst ab Index 1 zu nutzen - denn du musst jedesmal nachdenken, wieviele Elemente wirklich existieren. Dynamische Arrays beginnen mit Index 0 - aus, Amen.
- kpmais
- Beiträge: 42
- Registriert: Di 26. Mai 2020, 08:51
- OS, Lazarus, FPC: Winux (L 2.0.12, FPC 3.2.0; Debian/Win7)
- CPU-Target: x86-64
- Wohnort: Saarlouis/Saarland
Re: Verständnisproblem bei der Länge von Arrays
Danke für die Antwort.
Genau so verstehe ich es auch.
Was mich irritiert ist, dass nach meinem Verständnis mit setlength(..., 0) eben 0 Elemente reingesetzt werden, als reine Initialisierung.
Es scheint aber wohl so zu sein, dass ich damit den Index 0 setze, also das erste Element.
Im Gegensatz dazu liefert dann length(...) die aktuelle Anzahl des Arrays.
Intuitiv finde ich das nicht kongruent sondern etwas verwirrend bzw. gewöhnungsbedürftig.
Das ist mein Verständnisproblem.
Genau so verstehe ich es auch.
Was mich irritiert ist, dass nach meinem Verständnis mit setlength(..., 0) eben 0 Elemente reingesetzt werden, als reine Initialisierung.
Es scheint aber wohl so zu sein, dass ich damit den Index 0 setze, also das erste Element.
Im Gegensatz dazu liefert dann length(...) die aktuelle Anzahl des Arrays.
Intuitiv finde ich das nicht kongruent sondern etwas verwirrend bzw. gewöhnungsbedürftig.
Das ist mein Verständnisproblem.
Re: Verständnisproblem bei der Länge von Arrays
Das ist nicht richtig. Mit SetLength(data, 0) erzeugst du ein Array mit 0 Elementen; das ist äquivalent dazu, den Zeiger auf das Array auf nil zu setzen (data := nil).
Code: Alles auswählen
program Project1;
var
data: array of integer;
begin
SetLength(data, 0);
WriteLn(Length(data)); // --> Ausgabe: 0
// WriteLn(data[0]); // <--- Absturz hier weil mindestens 1 Element benötigt wird
SetLength(data, 2);
WriteLn(Length(data)); // Ausgabe: 2
data := nil;
WriteLn(Length(data)); // Ausgabe: 0
ReadLn;
end.
- kpmais
- Beiträge: 42
- Registriert: Di 26. Mai 2020, 08:51
- OS, Lazarus, FPC: Winux (L 2.0.12, FPC 3.2.0; Debian/Win7)
- CPU-Target: x86-64
- Wohnort: Saarlouis/Saarland
Re: Verständnisproblem bei der Länge von Arrays
Du hast vollkommen recht.
Und jetzt habe ich auch die Krux gefunden.
Ich habe als Rückgabe einen String, den ich auf ';' splitte.
Ich hatte erwartet, dass bei einem leeren gesplitteten String das Array eben 0 Elemente hat, also die Initialisierung behält ( mit 0).
Das ist aber nicht der Fall.
einen leeren String mit Text.split(';') erhält ein Array mit einem Element.
Das hatte ich mir mit dem obigen Problem erklärt.
Falsch erklärt. Problem war woanders.
Vielen Dank nochmal.
Und jetzt habe ich auch die Krux gefunden.
Ich habe als Rückgabe einen String, den ich auf ';' splitte.
Ich hatte erwartet, dass bei einem leeren gesplitteten String das Array eben 0 Elemente hat, also die Initialisierung behält ( mit 0).
Das ist aber nicht der Fall.
einen leeren String mit Text.split(';') erhält ein Array mit einem Element.
Das hatte ich mir mit dem obigen Problem erklärt.
Falsch erklärt. Problem war woanders.
Vielen Dank nochmal.