Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit einer Schleife


LuMa86 - Do 27.06.13 20:39
Titel: Problem mit einer Schleife
Moin,
ich weiß nicht ganz wie ich es erklären soll. Ich habe ein Array. In einer for-Schleife soll eine Gegebenheit geprüft werden und wenn diese zutrifft ein Eintrag entfernt werden. Allerdings ist das ein Problem, den die Schleife sieht wie folgt aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
for i := 0 to (Length(Events) - 1do
      if MArray[i].Name = NameVar then
      begin
        DeleteElement(MArray, i);
        Break;
      end;


Wenn ich jetzt ein Element aus dem Array lösche, stimmt die Länge natürlich nicht mehr, nach der das Programm aber zählt. Zwangsläufig versucht das Programm dann also außerhalb des Arrays eine Aktion durchzuführen was wiederum zu einer Exception führt. In einer Zählschleife kann ich "i" nicht von Hand verändern, daher meine Frage, wie ich das am besten löse. Ich hätte an eine Kombination von Break gedacht und die Schleife dann neu starten, aber das wirkt alles etwas überdimensioniert. Gibt es da keine einfachere integrierte Lösung?

Danke,
LuMa


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 27.06.2013 um 20:47


Marc. - Do 27.06.13 20:44

Durchlaufe die Schleife einfach rückwärts. ;)


Delphi-Quelltext
1:
for i := (Length(Events) - 1downto 0 do                    


LuMa86 - Do 27.06.13 20:49

Tatsächlich :o Funktioniert super. Muss mir diese Standartsachen nochmal reinfahren :oops:


IhopeonlyReader - Do 27.06.13 22:54

Und anstatt Length(Events)-1 sollteste am besten High(Events) verwenden und anstatt 0 evt Low(Events) (wobei low hier ja immer konstant ist, also auch direkt 0 geschrieben werden kann)


jaenicke - Fr 28.06.13 06:20

Wobei es schneller ist die Schleife normal durchzugehen und die Elemente nur umzukopieren, die nach den zu löschenden kommen und am Ende einmal das Array zu verkleinern. Deine DeleteElement Funktion macht das vermutlich für jeden zu löschenden Eintrag, das ist sehr ineffizient...

user profile iconLuMa86 hat folgendes geschrieben Zum zitierten Posting springen:
Tatsächlich :o Funktioniert super. Muss mir diese Standartsachen nochmal reinfahren :oops:
Welche Arten eines Standes?
http://www.k-faktor.com/standart/