Falscher ListIndex bei LinkedList

Für allgemeine Fragen zur Programmierung mit PureBasic.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Falscher ListIndex bei LinkedList

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

nimm For Each, oder Repeat Until, ansonsten wirste 1-nen abziehen müssen, habs jetzt aber nicht getestet,
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag 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
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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. ;)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag 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
Antworten