Ich bin mir jetzt nicht sicher ob man das als 'reinen' Bug sehen kann da der Debugger ja eigentlich warnt, aber das Verhalten ist doch unerwartet:
Ich iteriere durch alle Elemente einer Liste und in dieser Iteration muss ich nochmal durch alle Elemente iterieren (ein Element gegen alle anderen vergleichen), also ein ideales Einsatzgebiet für Push/Pop - ListPosition. Nun werden in der inneren Iteration einige Elemente der Liste gelöscht, und es kann auch vorkommen das dass Element gelöscht wird auf das PopListPosition() angewant wurde. Nun meckert der Debugger das auch an (wobei ich den nicht nutzen konnte da das Ganze in eine DLL steckt die selbst nicht lauffähig ist.), und es ist ja nicht so schwer das anders zu programmieren, wie inzwischen auch geschehen. ABER, jetzt der Teil der mich stört: ohne Debugger kompiliert steht nach dem PopListPosition() das gelöschte Element als aktuelles Element wieder zur Verfügung, OHNE irgend einen illegalen Speicherzugriff zu verursachen (liegt wohl daran dass das Element nicht gelöscht wird da die PB - Listen Elemente "geblock" alloziert werden). Fügt man nun Elemente hinzu, resultiert das Ergebnis (je nach den folgenden Listen - Befehlen, unterschiedlich) entweder in einer Endlos - Liste die nur aus den neuen Elementen besteht oder in einer korrekten Version der alten List (wo allerdings die neuen Fehlen). Also, will sagen: Der Fehler liegt darin das PoplistPosition() oder DeleteElement() sich nicht so verhalten wie erwartet (irgend einen Speicher-Fehler, btw. DeleteElement() könnte auf das Previous-Element zurückfallen wenn ein PushListPosition() Element gelöscht wird, wenn es möglich ist das zu detektieren (was ja bereits gemacht wird), sollte es auch möglich sein den "gepopten" Wert durch den Previous-Wert oder 0 zu ersetzen, also das nach PopListPosition() das erwartete Ergebniss nach einem Delete() vorliegt.)
Code: Alles auswählen
EnableExplicit
NewList t()
; Testdaten:
AddElement(t()) : t() = 1
AddElement(t()) : t() = 2
AddElement(t()) : t() = 3
AddElement(t()) : t() = 0
; Code ist in einer DLL, also die einzig möglichen Debug Ausgaben sind via MessageRequester()
DisableDebugger
; Alle Elemente aus t() löschen die gleich 0 sind
PushListPosition(t())
ForEach t()
If Not t()
DeleteElement(t())
EndIf
Next
PopListPosition(t())
EnableDebugger
AddElement(t()) : t() = 4
AddElement(t()) : t() = 5
AddElement(t()) : t() = 6
If #True ; Change to see the Result
Repeat
Debug t()
Until Not PreviousElement(t())
Else
ForEach t()
Debug t()
Next
EndIf