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) - 1) do 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
Narses: 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) - 1) downto 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...
LuMa86 hat folgendes geschrieben : |
| Tatsächlich :o Funktioniert super. Muss mir diese Standartsachen nochmal reinfahren :oops: |
Welche Arten eines Standes?
http://www.k-faktor.com/standart/
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!