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:
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
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

Re: [OK] Bug erledigt, eigener blöder Datensammel-Fehler
Verfasst: 23.09.2011 12:18
von Kiffi
dag hat geschrieben:[...] OPENFILE [...]
Strrrike!
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
