LinkedList debuggen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

LinkedList debuggen

Beitrag von alen »

Hallo Zusammen,

habe mal wieder PB ausgepackt und programmiere an einem Projekt weiter. Dabei benutze ich zwei einfache LinkedLists die mit Daten befüllt werden. Die beiden Listen mache ich global verfügbar um die in anderen Programmteilen weiterzuverwenden. Nur scheint sich ein Fehler eingeschlichen zu haben. Die Listen werden auf dem Weg zu einem anderen Programmteil irgendwo verändert.

Das heisst ich brauche eine Möglichkeit eines schnellen Debuggings für diese Listen so das ich den Inhalt im weiteren Programmverlauf kontrollieren kann.

Und hier könnte ich Hilfe oder einen Denkansatz gebrauchen.

Grüße
Alen Hopek


Hier habe ich mal die Erzeugung der Listen angehängt:

Code: Alles auswählen

...
Global NewList StartTrackList()
Global NewList TrackLengthList()

Procedure CreateTrackLists(NumberOfDrives)
  If NumberOfDrives > 0
    For Drive = 1 To NumberOfDrives
      UseAudioCD(Drive-1)
      
      If AudioCDTracks() > 0
        NumTracks     = AudioCDTracks() 
        
        InsertElement(StartTrackList())
        InsertElement(TrackLengthList())
        
        StartTrackList() = 2
        
        For Track = 1 To NumTracks          
          StartTimeTrack = StartTimeTrack + AudioCDTrackLength(Track)
          AddElement(StartTrackList())
          AddElement(TrackLengthList())
          StartTrackList()  = StartTimeTrack
          TrackLengthList() = AudioCDTrackLength(Track)
        Next
        
        LastElement(StartTrackList())
        DeleteElement(StartTrackList())     
         
        Counter = 1
        ForEach StartTrackList()
          track_length = AudioCDTrackLength(Counter)
          total_length + track_length
          Counter + 1
        Next
        
      EndIf
    Next
  EndIf  
EndProcedure
...
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Code: Alles auswählen

Macro DebugList
  Debug "*****StartTrackList()*****"
  ForEach StartTrackList() ;beliebige Liste
    Debug StartTrackList() ;debugen
  Next
EndMacro

DebugList
sowas?
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

Beitrag von NicTheQuick »

Ich würde sowas hier vorschlagen:

Code: Alles auswählen

Procedure DebugList(List())
  Protected *Current = @List(), a.l = 0
  ForEach List()
    Debug Str(a) + " : " + Str(List())
    a + 1
  Next
  ChangeCurrentElement(List(), *Current) ;aktuelles Element wieder zurücksetzen
EndProcedure
Muss nur abgeändert werden, falls die Liste vom Typ String ist oder eine
Struktur besitzt.

@alen:
Pass auf mit LinkedLists, wenn du Threads benutzt. Es können keine zwei
Thread gleichzeitig auf die selbe LinkedList zugreifen. Ich bin mir nicht
sicher, aber es könnte sein, dass man sogar allgemein nicht auf zwei
LinkedLists geichzeitig zugreifen kann, selbst wenn es verschiedene sind.
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Beitrag von NicknameFJ »

Hallo,

ich würde das Beispiel von Gnasen so abändern:

Code: Alles auswählen


Procedure  DebugList (Liste.s(),Name.s)

Protected *Old_Element
  
  If CountList(Liste())
     *Old_Element = @Liste()

     Debug "*****" +Name  + "*****" 
     ForEach Liste() ;beliebige Liste 
       Debug Liste() ;debugen 
     Next 
  
     ChangeCurrentElement(Liste(), *Old_Element)
  EndIf
EndProcedure

DebugList(StartTracklist(),"Name der Liste")


Durch die Foreach Schleife wird das aktuelle Element verändert. Daher sollte um weitere Konflikte im Programm zu vermeiden, dieses gesichert und wieder rückgesetzt werden.

Im Parameter der Procedure muss der Listenname mit angegeben werden - hier: StartTrackList(). Die Procedure kann dann für alle LinkedList verwendet werden. Zur Unterscheidung in der Debug Liste dann den Übergabestring "Name der Liste" noch entsprechend beim Aufruf angeben.


Grüße

Joachim


@NTQ: Man sollte nicht zwischendurch telefonieren, wie ich es gemacht habe, dadurch warst Du schneller - MIST
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Besten Dank für die Hilfe

Beitrag von alen »

Hallo Zusammen,

besten Dank für die Hilfe, dass hat mich schon wieder ein Stück weitergebracht.

Wenn das Produkt fertig werden sollte, werde ich meine Erkenntnisse auch mit euch teilen. Ist mein erstes ernsthaftes PB Projekt.

Grüße
Alen Hopek

:allright:
Antworten