Seite 1 von 1

Falscher ListIndex bei LinkedList

Verfasst: 24.02.2005 19:41
von Sven
Die PB-Hilfe sagt zum ListIndex(): "Der von diesem Befehl zurückgegebene Wert beinhaltet die Position des aktuellen Elements in der Liste. Das erste Element befindet sich dabei an Position 0, das nächste an 1 und so weiter. Ein Rückgabewert von -1 bedeutet, dass es kein aktuelles Element gibt (entweder ist die Liste leer, Sie haben sich mittels PreviousElement() oder NextElement() über den Beginn oder das Ende der Liste hinaus bewegt, oder Sie haben ResetList() benutzt). "

Mit folgendem Codeabschnitt sollte ich somit als Ergebnis die Position des Objektes in der Liste erhalten, oder -1, wenn das Objekt nicht vorhanden (NextElement über Ende hinaus).

Code: Alles auswählen

Procedure FindObject(object.l)
  ResetList(obj())  ;Liste auf Anfang
  While NextElement(obj())  ;Liste durchlaufen
    If object = obj()\id1  ;wenn gefunden, verlassen
      Break
    EndIf
  Wend
  ProcedureReturn ListIndex(obj())
EndProcedure
Ich erhalte aber immer die Position des letzten Elementes (CountList() - 1), wenn das Objekt nicht vorhanden ist. Stimmt hier ListIndex() nicht, stimmt hier die Hilfe nicht oder muss ich das anders abfragen?

Sven

Verfasst: 24.02.2005 19:53
von ts-soft
nimm For Each, oder Repeat Until, ansonsten wirste 1-nen abziehen müssen, habs jetzt aber nicht getestet,

Verfasst: 25.02.2005 11:18
von Sven
@ts-soft

Wieso? Versteh ich nicht. Beweisführung durch Autorität: Das steht aber auch so irgendwo im CodeArchiv (oder so ähnlich).

Nee, mal ernsthaft:

Code: Alles auswählen

 ResetList(obj()) ;Liste auf Anfang
 ;der Zeiger steht vor dem ersten Element, ListIndex gibt -1 zurück 
 While NextElement(obj()) ;Liste durchlaufen
  ;der Zeiger steht auf dem nächsten Element, ListIndex gibt die Pos zurück 
  If object = obj()\id1 ;wenn gefunden, verlassen
   Break
  EndIf
 Wend
 ProcedureReturn ListIndex(obj())
 ;wird die Schleife mit Break verlassen, steht der Zeiger auf dem gefundenen Element, ListIndex gibt richtig die gefundene Pos zurück
 ;wird das gesuchte Objekt nicht gefunden, gibt ListIndex die Pos des letzten Elementes zurück, sollte eigentlich wieder -1 sein
 ;aber: ist kein Element vorhanden, gibt ListIndex richtig -1 zurück
Das macht nur Sinn, wenn NextElement nur dann ein nächstes Element auswählt, wenn dieses vorhanden ist. Dann stimmt aber die Angabe in der Hilfe " Sie haben sich mittels ... NextElement() über ... das Ende der Liste hinaus bewegt" nicht und ist ziemlich irreführend, oder?

Sven

Verfasst: 25.02.2005 15:40
von Ynnus
Unabhängig jetzt von dem Problem, damit hab ich mich jetzt nicht befasst, aber auf das Code-Archiv kann man sich leider nicht immer verlassen. Die geposteten Codes mögen zwar irgendwann mal korrekt gewesen sein, aber es kommt oft vor, dass Befehle geändert wurden oder Compilerbedingt nun ein anderes Verhaltensmuster auftritt. Besonders bei LinkedLists wurde oft was geändert. ;)

Verfasst: 25.02.2005 19:03
von ts-soft
hab nicht im CodeArchiv nachgeguckt. Jedoch wird bei einer While:Wend Schleife die Bedingung am Anfang der Schleife geprüft, währenddessen bei einer Repeat:Until Schleife die Bedingung am Ende der Schleife geprüft wird.
Das solltest selbst Du wissen. Habe aber immer noch nicht getestet, weil dieser Thread ist für mich abgeschlossen. Und welche Autorität, hab ich auch nicht verstanden

Verfasst: 27.02.2005 13:42
von Sven
@ts-soft

Hallo, werden wir jetzt persönlich. >> Das solltest selbst Du wissen.

@alle anderen, die an einer Lösung des Problems interessiert sind

Wenn ich die Liste mit ResetList zurücksetze, steht sie bei -1, also MUSS ich ein NextElement() VOR der ersten Abfrage machen. Und wenn die Liste leer ist (NextElement liefert Null), wird die Schleife gar nicht erst durchlaufen. Das stimmt also erstmal.

Das Problem liegt offensichtlich darin, das NextElement() nicht wie in der Hilfe angegeben über das Ende der Liste hinausgeht (was durchaus möglich wäre, ResetList() geht ja auch über den Anfang "vor das erste Element"), sondern beim letzten Element stehenbleibt. Somit stimmt der von ListIndex() zurückgegebene Wert nicht mit dem nach der Hilfe zu erwartenden Wert überein.

Sehe ich das falsch?

Sven