Seite 1 von 1

[OK] Bug erledigt, eigener blöder Datensammel-Fehler

Verfasst: 22.09.2011 16:49
von dag
Hallo
Das entdeckte Problem ist die Löschung von Listen mit ClearList().

In meinem Code habe ich eine Liste mit bisher einer Spalte.
Diese wird mehrfach gelöscht, gefüllt und ausgedruckt. Das löschen wird dabei mit ClearList() erledigt.

Aber: wenn die vorherige Liste grösser ist als die nachfolgende, wird diese nicht vollständig gelöscht, sondern ist wieder da.!
Der verantwortliche Ausschnitt:

Code: Alles auswählen

      Case 3
        ;{ 3: Top 10 Anwender: Tickets / Zeit
        ClearList(werte())
        Repeat  
          z$ = ReadString(fdaten)   ; Beschreibungszeile und Datenzeilen
          If Left(z$,11) = "Aufgabe(n) "  ;  Neuer Abschnitt ab in die Textausgabe und dann next ii
            Break
          EndIf
          AddElement(werte())
          werte()\Wertkette = z$
        Until Eof(fdaten) <>0
        ; Druckstart
        If DefaultPrinter()
        ; ****** Druckkopf/Überschrift ********
          If StartPrinting("Ticketauswertung 3")  ; Titel im Spooler
            hDC = StartDrawing(PrinterOutput())
            If hDC
              DrawingMode(#PB_2DDrawing_Transparent)
Danach folgt nur eine formatierte Druckausgabe.

Hier noch der Ausschnitt aus dem Debug-VariableViewer-View List:

Bild

Oben bis Wert 11 neue Daten, unten die alten Zahlen aus der "Gelöschten" Liste. Die erste "alte" Zahl 24 ist auch nur ein Bruchstück der eigentlich 5 stelligen Zahl.

Re: [4.60 RC1] Bug bei LinkedLists - ClearList(werte())

Verfasst: 22.09.2011 16:53
von Kiffi
?

die Größe der LinkedList ist doch abhängig von den Daten in Deiner Datei.

Vermutung: OpenFile() anstelle von CreateFile() verwendet?

Grüße ... Kiffi

Re: [4.60 RC1] Bug bei LinkedLists - ClearList(werte())

Verfasst: 22.09.2011 16:54
von NicTheQuick
Könntest du einen lauffähigen Beispielcode posten, damit wir das nachvollziehen können?

Re: [4.60 RC1] Bug bei LinkedLists - ClearList(werte())

Verfasst: 22.09.2011 16:58
von STARGÅTE
Erst mal wäre es schön, wenn du ein ausführbaren Code posten würdest, an dem man das Problem eindeutig erkennen kann.

Zu den LinkedListen selbst ist zu sagen, dass DeleteElement/ClearList nicht sofort den Inhalt der Elemente frei gibt, sonden zunächst immer nur die Verweise auf diese Inhalte.
Wenn ich also DeleteElement ausführe, ist war das Element weg, aber der Inhalt ist noch im Speicher, jedoch zum überschreiben freigegeben.

Aber wie gesagt, ein ausführbarer Code ist nötig, der das "Problem" reproduziert.

Re: [4.60 RC1] Bug bei LinkedLists - ClearList(werte())

Verfasst: 22.09.2011 21:32
von ullmann
Ich kann den Fehler nicht reproduzieren. Nachfolgender Code testet numerische, String- und strukturierte Listen. Auch 4.60 RC1 verhält sich hier korrekt. Auch die Variablenanzeige beim Debugger listet keine alten überflüssigen Elemente.

Code: Alles auswählen

; erster Test: numerische Liste

NewList Test.l()

For i = 1 To 20
  
  AddElement(Test())
  Test() = i
  
Next

Debug "Anzahl Listenelemente: " + Str(ListSize(Test()))

ClearList(Test())

Debug "Anzahl Listenelemente gelöscht: " + Str(ListSize(Test()))

For i = 100 To 105
  
  AddElement(Test())
  Test() = i
  
Next

Debug "Anzahl Listenelemente neu: " + Str(ListSize(Test()))

ForEach Test()
  
  Debug Test()
  
Next

; zweiter Test: Stringliste

NewList Texte.s()

For i = 1 To 20
  
  AddElement(Texte())
  Texte() = "Wert: " + Str(i)
  
Next

Debug "Anzahl Listenelemente: " + Str(ListSize(Texte()))

ClearList(Texte())

Debug "Anzahl Listenelemente gelöscht: " + Str(ListSize(Texte()))

For i = 100 To 105
  
  AddElement(Texte())
  Texte() = "Wert: " + Str(i)
  
Next

Debug "Anzahl Listenelemente neu: " + Str(ListSize(Texte()))

ForEach Texte()
  
  Debug Texte()
  
Next

; dritter Test: Stringliste mit Struktur

Structure Listtest
  
  Wert.l
  Text.s
  
EndStructure

NewList Block.Listtest()

For i = 1 To 20
  
  AddElement(Block())
  Block()\Wert = i
  Block()\Text = "Wert: " + Str(i)
  
Next

Debug "Anzahl Listenelemente: " + Str(ListSize(Block()))

ClearList(Block())

Debug "Anzahl Listenelemente gelöscht: " + Str(ListSize(Block()))

For i = 100 To 105
  
  AddElement(Block())
  Block()\Wert = i
  Block()\Text = "Wert: " + Str(i)
  
Next

Debug "Anzahl Listenelemente neu: " + Str(ListSize(Block()))

ForEach Block()
  
  Debug Block()\Wert
  Debug Block()\Text
  
Next

CallDebugger
Eine mögliche Fehlerursache wäre, dass du bei ClearList eine falsche Liste löschst oder einen Schreibfehler im Listennamen hast. Dann wird deine gewünschte Liste nicht gelöscht und wegen Addelement() du hast zu viele Elemente in der Liste. Vielleicht sortierst du dann deine aktuellen Elemente nach vorn, so dass die anderen hinten an stehen. Oder deine Liste ist nicht global und ClearList in einer Prozedur hat nur lokalen Zugriff, so dass keine Löschung der eigentlichen Liste erfolgt.

Re: [4.60 RC1] Bug bei LinkedLists - ClearList(werte())

Verfasst: 23.09.2011 05:51
von Nino
Hier anklicken:
Wie melde ich einen Bug?

Re: [OK] Bug erledigt, eigener blöder Datensammel-Fehler

Verfasst: 23.09.2011 09:33
von dag
Danke für die konstruktiven Antworten, der Fehler lag im Datensammeln und schreiben der Datei die dann in die Liste eingelesen wurde.
Das hatte ich gestern so kurz vor Feierabend übersehen. (unlogische Abfolge von OPENFILE / CLOSEFILE - Lösung war ein TruncateFile() vor dem CloseFile())

Nochmal Danke für die Geduld mit mir :lurk:

Re: [OK] Bug erledigt, eigener blöder Datensammel-Fehler

Verfasst: 23.09.2011 12:18
von Kiffi
dag hat geschrieben:[...] OPENFILE [...]
Strrrike! 8)
dag hat geschrieben:Lösung war ein TruncateFile() vor dem CloseFile()
Mit CreateFile() wäre das nicht passiert. Da braucht man auch keine TruncateFile().

egal. Bitte in Zukunft aber 2mal überlegen, wann man in's Bug-Forum postet
(und auch den Link von Nino auf das Posting von Thomas mal anklicken).

Grüße ... Kiffi

Re: [OK] Bug erledigt, eigener blöder Datensammel-Fehler

Verfasst: 23.09.2011 12:31
von bobobo
hmm ..

bug = dag
:mrgreen: