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

Für allgemeine Fragen zur Programmierung mit PureBasic.
dag
Beiträge: 12
Registriert: 16.06.2009 15:01

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

Beitrag 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.
Zuletzt geändert von dag am 23.09.2011 09:30, insgesamt 1-mal geändert.
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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
a²+b²=mc²
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag von NicTheQuick »

Könntest du einen lauffähigen Beispielcode posten, damit wir das nachvollziehen können?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

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

Beitrag 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.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

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

Beitrag von Nino »

Hier anklicken:
Wie melde ich einen Bug?
dag
Beiträge: 12
Registriert: 16.06.2009 15:01

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

Beitrag 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:
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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
a²+b²=mc²
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

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

Beitrag von bobobo »

hmm ..

bug = dag
:mrgreen:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten