Überschreiben von Listenplätzen (?)

Anfängerfragen zum Programmieren mit PureBasic.
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Überschreiben von Listenplätzen (?)

Beitrag von Re57 »

Hallo, ich habe eine List() erstellt und frage sie hinterher wieder ab. Das funktioniert auch alles, wenn es da nur nicht das Problem gäbe, daß man bereits belegte Listenplätze nicht einfach überschreiben kann. Wenn ich das richtig verstanden habe, müßte ich dazu mit dem Befehl ChangeCurrentElement() arbeiten, allerdings ist die Erklärung dazu in der Hilfe für mich Bahnhof, denn ich weiß nichts von Zeigern und Pointern. Es geht mir jedenfalls darum, daß z.B. das Element 4 in der List() einen neuen Inhalt bekommen soll, während der bisher vorhandene Inhalt zugleich ausscheidet. Kann mir jetzt bitte mal jemand hier ein paar Code-Zeilen aufschreiben, wie man das richtig hinschreibt mit dem ChangeCurrentElement()? Aber bitte nichts mit ForEach-Next, ich will direkt jeden einzelnen Listenplatz separat ansprechen können. Ich hoffe, daß das überhaupt so geht mit ChangeCurrentElement(). Hier die Beispiel- List():

Code: Alles auswählen

Select schritt
             Case 1
               AddElement(Beispiel())
               Beispiel() = zahl
             Case 2          
               AddElement(Beispiel())
               Beispiel() = zahl 
             Case 3
               AddElement(Beispiel())
               Beispiel() = zahl 
             Case 4
               AddElement(Beispiel())
               Beispiel() = zahl 
             Case 5
               AddElement(Beispiel())
               Beispiel() = zahl
             Case 6
               AddElement(Beispiel())
               Beispiel() = zahl
             Case 7
               AddElement(Beispiel())
               Beispiel() = zahl
           EndSelect
Danke!
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Überschreiben von Listenplätzen (?)

Beitrag von Kiffi »

SelectElement() ist Dein Freund.

Code: Alles auswählen

EnableExplicit

NewList myList()

AddElement(myList()) : myList() = 1
AddElement(myList()) : myList() = 2
AddElement(myList()) : myList() = 3

ForEach myList()
  Debug myList()
Next

SelectElement(myList(), 1) ; zweites Element wählen (0-basiert)

myList() = 99 ; zweites Element mit neuem Wert belegen

ForEach myList()
  Debug myList()
Next
Hygge
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Überschreiben von Listenplätzen (?)

Beitrag von NicTheQuick »

Was genau wolltest du uns eigentlich mit dem Select aus deinem ersten Post sagen? Das ist sehr redundant. Du kannst es auch einfach so schreiben:

Code: Alles auswählen

Select schritt
	Case 1 To 7
		AddElement(Beispiel())
		Beispiel() = zahl
EndSelect
Oder so

Code: Alles auswählen

If schritt >= 1 And schritt <= 7
	AddElement(Beispiel())
	Beispiel() = zahl
EndIf
Bild
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: Überschreiben von Listenplätzen (?)

Beitrag von Derren »

Das hast du doch letztens erst gefragt? Oder war das ein anderer User, der zufällige genau die gleiche Frage und genau den gleiche nicht-funktionierenden Code geposted hat
Signatur und so
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Überschreiben von Listenplätzen (?)

Beitrag von Re57 »

Danke Kiffi, aber löst nicht mein Problem. In meinem Programm sollen während des Arbeitens damit bestimmte Werte in die List() geschrieben werden. Es soll dann aber auch eine zurück-und neuschreiben-Funktion in das Programm. Um dann müßten die davon affektierten Listenelemente mit jeweils neuen Werten überschrieben werden können. Laut Debuggerausgabe ging das sogar, aber anschließend bei der Abfrage mit SelectElement() kamen dann doch falsche Werte an. Daraus hatte ich dann gefolgert, daß trotz richtiger Debugger-Ausgabe ein Neubelegen von Listenplätzen einfach nicht möglich ist, ohne vorher mit ClearList() die ganze Liste gelöscht zu haben, aber das scheidet natürlich aus.

@Derren

Der Code als solcher funktioniert (siehe oben) aber natürlich hatte ich jetzt nur ein sinngemäßes Beispiel hier eingestellt.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Überschreiben von Listenplätzen (?)

Beitrag von Kiffi »

Zeig mal einen lauffähigen kurzen Beispielcode, der Dein Problem verdeutlicht.
Hygge
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Überschreiben von Listenplätzen (?)

Beitrag von NicTheQuick »

Dein Code von oben zeigt gar nichts. Den kann man nicht mal in die IDE kopieren und ausführen.
Kiffis Beispiel zeigt wie es richtig geht und auch, dass es funktioniert. Da wir deinen restlichen Code aber nicht kennen, wissen wir nicht, wo dein Fehler in Wirklichkeit liegt.
Bild
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Überschreiben von Listenplätzen (?)

Beitrag von Re57 »

Inzwischen jetzt habe ich nun einen Beispiel-Code erstellt, der zeigt, um welches Problem es mir geht. Das Beispiel zeigt 10 weiße Boxen nebeneinander.

1) Wenn man jetzt z.B. die letzten 3 Boxen nacheinander anklickt, also von links nach rechts gezählt die Boxen 8-10, werden deren Zahlenwerte 8, 9 und 10 in der List "Beispiel.i()" gespeichert. Dies wird auch gleich per Debugger bestätigt.

2) Durch das Drücken der Taste W (=Wiedergabe) kann man sich nun anzeigen lassen, daß die Boxen-Zahlenwerte ordnungsgemäß aus der List abgerufen und wiedergegeben werden.

3) Die Back-Taste wird gedrückt, welche bei jedem Drücken dafür sorgt, daß es jeweils einen Schritt zurück geht.

4) Es werden erneut weiße Boxen angeklickt, z.B. die Boxen 2-4. Diese Werte werden dann wieder erfolgreich in der List gespeichert und der Debugger zeigt das auch an.

5) Das Drücken der Taste W bringt dann die Ernüchterung: Jetzt tauchen nicht die neuen, sondern erneut die alten Werte auf, allerdings läßt dann die allerletzte Anzeige im Debugger etwas erahnen... und tatsächlich: Wenn die Endlosschleifen-Sperre kl2 aus dem Code entfernt wird, werden in der Wiedergabe abwechselnd die alten, dann die neuen und dann wieder die alten Werte angezeigt. Und dann stoppt auch noch die Debugger-Ausgabe, obwohl doch die Schleife ohne die Sperre eigentlich immer weiter laufen müßte (?) Hier der Code:

Code: Alles auswählen

#Flags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered

If InitMouse() = 0
  MessageRequester("InitMouse fehlgeschlagen", "")
EndIf  

If InitSprite() = 0
  MessageRequester("InitSprite fehlgeschlagen", "")
EndIf

If InitKeyboard() = 0
  MessageRequester("InitKeyboard fehlgeschlagen", "")
EndIf  

If OpenWindow(1,0,0,800,412,"",#Flags) = 0
  MessageRequester("OpenWindow fehlgeschlagen", "")
EndIf

If OpenWindowedScreen(WindowID(1),0,0,800,412) = 0
  MessageRequester("OpenWindowedScreen fehlgeschlagen", "")
EndIf

   StartDrawing(ScreenOutput())
   Box(0,0,800,412,RGB(100,100,220)) ; gr. blaue Farbbox
   StopDrawing(): FlipBuffers()
  
   x = 21  ; Startpunkt linke obere Ecke  
   y = 302 ; Startpunkt linke obere Ecke 
   b = 22  
   h = 107 ; 107
  
   For k = 1 To 10 ; wB.
     StartDrawing(ScreenOutput())
     Box(x,y,b,h,RGB(250,250,250))
     StopDrawing() 
     x = x + 23
   Next : FlipBuffers()
   
  ;____________________________________________________________________________________________________________________________________________________________________


NewList Beispiel.i()

kl1 = 1
kl2 = 1
kl3 = 1

Repeat   
    ExamineKeyboard()
    Event = WaitWindowEvent()
      Select Event    
        Case #PB_Event_LeftClick
          kl1 = 1
          wmx = WindowMouseX(1)
          wmy = WindowMouseY(1)
          
        Case #PB_Event_CloseWindow
          schliessen = 1
      EndSelect  
      
        If (wmx >= 21 And wmx <= 779) And (wmy > 302 And wmy < 408) And kl1 = 1
          kl1 = 0
        
          zahl = (wmx+2) / 23 ; steht für die Boxen 1 - 10
          
          schritt = schritt + 1
         
           Select schritt
             Case 1
               AddElement(Beispiel())
               Beispiel() = zahl : Debug Beispiel()
             Case 2          
               AddElement(Beispiel())
               Beispiel() = zahl : Debug Beispiel()
             Case 3
               AddElement(Beispiel())
               Beispiel() = zahl : Debug Beispiel()
             Case 4
               AddElement(Beispiel())
               Beispiel() = zahl : Debug Beispiel()
             Case 5
               AddElement(Beispiel())
               Beispiel() = zahl : Debug Beispiel()
             Case 6
               AddElement(Beispiel())
               Beispiel() = zahl : Debug Beispiel()
             Case 7
               AddElement(Beispiel())
               Beispiel() = zahl : Debug Beispiel()
             Case 8
               AddElement(Beispiel())
               Beispiel() = zahl : Debug Beispiel()
             Case 9
               AddElement(Beispiel())
               Beispiel() = zahl : Debug Beispiel()
             Case 10
               AddElement(Beispiel())
               Beispiel() = zahl : Debug Beispiel() 
           EndSelect
        EndIf
       
        If KeyboardReleased(#PB_Key_W)
          kl2 = 1
        EndIf
        
        ; Taste W steht für Wiedergabe  
        If KeyboardPushed(#PB_Key_W) And kl2 = 1
          kl2 = 0
          
          For i = 1 To schritt
            SelectElement(Beispiel(),i-1)
            box = Beispiel() : Debug box
                   
          Next
        EndIf
        
        ; Back-Taste erzeugt Schritt zurück
        If KeyboardReleased(#PB_Key_Back)
          kl3 = 1
        EndIf
        
        If KeyboardPushed(#PB_Key_Back) And kl3 = 1
          kl3 = 0
          schritt = schritt - 1
          If schritt < 1
            schritt = 1
          EndIf
        EndIf
        
Until schliessen = 1 Or KeyboardPushed(#PB_Key_F1)     
End 
Danke für Info.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Überschreiben von Listenplätzen (?)

Beitrag von Mijikai »

Example that uses a List:

Code: Alles auswählen

EnableExplicit

;note: this is just a poc / some window elements are only drawn once and may not get restored!

Procedure.i Main()
  Protected wnd.i
  Protected wnd_flag.i
  Protected wnd_msg.i
  Protected index.i
  Protected mx.i
  Protected my.i
  Protected Dim offset.i(9,1)
  Protected NewList notes.i()
  Protected list_view.i
  Protected list_play.i
  Protected button_back.i
  Protected button_play.i
  wnd_flag = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
  wnd = OpenWindow(#PB_Any,#Null,#Null,640,420,#Null$,wnd_flag)
  If wnd
    AddWindowTimer(wnd,1,200)
    list_view = ListViewGadget(#PB_Any,420,10,20,360)
    list_play = ListViewGadget(#PB_Any,450,10,20,360)
    button_back = ButtonGadget(#PB_Any,420,380,20,30,"<")
    button_play = ButtonGadget(#PB_Any,450,380,20,30,">")
    If StartDrawing(WindowOutput(wnd))
      Box(10,10,400,400,$180B04)
      For index = 0 To 9
        offset(index,0) = 20 + (index * 25)
        Box(offset(index,0),280,20,120,$FFFF88)
        Box(offset(index,0) + 2,282,16,116,$302704)
      Next
      StopDrawing()
    EndIf
    Repeat
      wnd_msg = WaitWindowEvent()
      Select wnd_msg  
        Case #PB_Event_Gadget
          Select EventGadget()
            Case button_back;<- remove a note from the list
            If ListSize(notes())
              LastElement(notes())
              DeleteElement(notes())
              RemoveGadgetItem(list_view,0)
            EndIf
          Case button_play;<- replay all recorded notes
            ClearGadgetItems(list_play)
            ForEach notes()
              AddGadgetItem(list_play,-1,Str(notes()))
            Next
          EndSelect
        Case #PB_Event_Timer;<- this is just for a little animation
          For index = 0 To 9
            If offset(index,1) > 1
              offset(index,1) - 1
            ElseIf offset(index,1) = 1
              If StartDrawing(WindowOutput(wnd))
                Box(offset(index,0) + 2,282,16,116,$302704)
                StopDrawing()
              EndIf
              offset(index,1) = 0
            EndIf
          Next
        Case  #PB_Event_LeftClick;<- check for mouse click
          mx = WindowMouseX(wnd);<- get mouse position
          my = WindowMouseY(wnd)
          If my > 280 And my < 400;<- is the mouse inside a 'piano' button
            For index = 0 To 9
              If mx > offset(index,0) And mx < offset(index,0) + 20
                If StartDrawing(WindowOutput(wnd));<- color the 'piano' button differentl if its pressed
                  Box(offset(index,0) + 2,282,16,116,$8D8D04)
                  StopDrawing()
                EndIf
                offset(index,1) = 2;<- mark the button for animation
                LastElement(notes())
                If AddElement(notes())
                  notes() = index;<- store the active note
                  AddGadgetItem(list_view,0,Str(index))
                EndIf
                Break
              EndIf
            Next
          EndIf
        Case #PB_Event_CloseWindow
          Break
      EndSelect
    ForEver
    CloseWindow(wnd)
  EndIf
  ProcedureReturn #Null
EndProcedure

Main()

End
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Überschreiben von Listenplätzen (?)

Beitrag von Re57 »

Danke Mijikai, aber dafür bin ich leider nicht fortgeschritten genug mit PureBasic. Mit Prozedzuren z.B. konnte ich mich noch nie beschäftigen, weil, wenn ich Neuland erschließen will, kann ich mit so ein paar in der PureBasic-Hilfe hingeknallten Brocken nichts anfangen. Gut strukturiert ist die Hilfe allerdings schon. Vielleicht wird auch einfach mal PureBasic selber so verbessert, daß man Werte von Listenelementen genauso einfach neu belegen kann wie Werte bei gewöhnlichen Variablen, dann wäre dieser Thread ja gar nicht erst entstanden. Heute werde ich wiedermal kaum Zeit haben für PureBasic, aber ich bleibe irgendwie dran.
Antworten