Verständnisproblem bei der Länge von Arrays

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
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

Verständnisproblem bei der Länge von Arrays

Beitrag von kpmais »

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?

Benutzeravatar
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

Beitrag von kpmais »

Das ? hinter meinarray ist ein Schreibfehler.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Verständnisproblem bei der Länge von Arrays

Beitrag von wp_xyz »

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.

Benutzeravatar
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

Beitrag von kpmais »

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.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Verständnisproblem bei der Länge von Arrays

Beitrag von wp_xyz »

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.  

Benutzeravatar
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

Beitrag von kpmais »

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.

Antworten