Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Existiert das n-te Element eines dynamischen Arrays?


ZO_orki - Fr 19.01.07 20:43
Titel: Existiert das n-te Element eines dynamischen Arrays?
Hallo.

Eigendlich sagt der Titel schon was ich herausfinden will.
Das Problem an der ganzen Sache ist, dass ich nicht mit
Assigned arbeiten kann, weil die einzelnen Elemente
eventuelle von vornerein Werte haben.
Und weil es keine statisches Array ist, kann ich auch
nicht mal eben alle Elemente auf NIL setzten.

Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht,
jedenfalls brauche ich Hilfe.

MfG ZO_orki

PS: Im Array ist ein von mir geschriebenes Objekt gespeichert.


BenBE - Fr 19.01.07 23:13

Du hast ein Array XY und willst dort wissen, ob Du auf das Element an Index ABC zugreifen kannst?

Dann mach's so: Accessable := Assigned(XY) and (Low(XY) <= ABC) and (High(XY) >= ABC);

Funktioniert mit jeder Art von Array.


ZO_orki - Mo 22.01.07 00:15

Hmmm....

Wie ist das wenn ich jetzt ein dynamisches Array habe mit einer Länge von z.B. 1-5.
Und ich jetzt den dritten Wert löschen würde. Dann würde das doch nciht funktionieren, oder?


Logikmensch - Mo 22.01.07 14:30

Also, üblicherweise macht man das genau so wie es BenBE vorschlägt. Auch nach dem Löschen eines oder mehrerer Elemente solltest Du das immer wieder neu abtesten, denn weil Dein Array dynamisch ist, musst Du eben auch alle Fehlermöglichkeiten abfangen.
Man kann auch jedweden Zugriff auf das Array mit einer Sicherheitsumschachtelung (analog BenBE) so machen:


Delphi-Quelltext
1:
2:
3:
if assigned(myarray) and (index>=low(myarray)) and (index<=high(myarray)) then
   .... Dein Code
end;


Also, nun keine Angst und drauf losprogrammieren! :-D


Logikmensch - Mo 22.01.07 14:35

Übrigens:

Zitat:
Wie ist das wenn ich jetzt ein dynamisches Array habe mit einer Länge von z.B. 1-5.
Und ich jetzt den dritten Wert löschen würde. Dann würde das doch nciht funktionieren, oder?


Generell haben dynamische Arrays, da sie ja nur über SetLength(Array,Anzahl) zugewiesen werden, den Startindex 0. Die Indexzählung nach einem z.B. Setlength(myarray,5) wäre dann 0,1,...4.
Low(Dein Array) ergibt dabei grundsätzlich 0 und High(Dein Array) ergibt dann 4.
Nach dem Löschen des 3. Elementes geht der Bereich dann eben nur noch von 0 bis 3.

Grundsätzlich kann man aber sowohl bei dynamischen Arrays wie auch bei statischen mit Low() und High() abprüfen. Das macht den Code immer flexibler, falls Du mal was änderst.