Überschreiben von Listenplätzen (?)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Überschreiben von Listenplätzen (?)

Beitrag von STARGÅTE »

Ich habe nicht alles genau mitverfolgt, aber ich behaupte mal, dass dir mit einem Array besser geholfen ist, statt mit einer Liste.
Bei Arrays kannst du zu beginn 10 Elemente anlegen, befüllen und bestimmte Elemente anhand ihrer Position eindeutig lokalisieren, lesen und ändern.
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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
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 »

Re57 hat geschrieben: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.
Tut mir Leid, aber da gibt es nichts zu verbessern. Listen funktionieren eben genau so und haben einen Grund so zu existieren. Ich habe wie Stargate auch das Gefühl, dass du lieber mit Arrays arbeiten solltest. Denn Listen sind gedacht für eine dynamische Anzahl von Elementen, die man nicht oder selten per Index ansteuert.

Im Übrigens ist der Code in deinem Select-Block immer noch redundant. Du machst in jedem Case genau das gleiche. Oder kommt da zukünftig überall was anderes hin?
Bild
ST4242
Beiträge: 42
Registriert: 29.10.2011 16:54

Re: Überschreiben von Listenplätzen (?)

Beitrag von ST4242 »

Hallo,

ich glaube auch das Du den Sinn von Listen nicht ganz verinnerlicht hast.

Für den Anwendungsfall ist ein Array die bessere Lösung.

Wenn ich deine Select Anweisung richtig verstehe möchtest Du je nach Schritt ein Element hinzufügen.
Allerdings ist es dem Addelement egal, welchen Schritt du ausgewählt hast, sondern es fügt immer an der aktuellen (der zuletzt z.b über Selectelement selktierten position) ein Element ein.

Nutzt du ein Array wird über über den nachfolgenden Wert in der Klammer immer exakt die gleiche Position ausgewählt, unabhänig was vorher oder nachher steht.

Ich hoffe die Erklärungen haben etwas weiter geholfen

Gruß
ST4242
Beiträge: 42
Registriert: 29.10.2011 16:54

Re: Überschreiben von Listenplätzen (?)

Beitrag von ST4242 »

Hallo,
anbei habe den Code auch geändert für auf Array's

Ich hoffe das klärt eventuell die Verständnisprobleme

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()
   
  ;____________________________________________________________________________________________________________________________________________________________________


Dim  Beispiel.i(10)

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
          beispiel(schritt)=zahl
        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(i) : 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 
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Überschreiben von Listenplätzen (?)

Beitrag von Re57 »

Mittlerweile läuft mein Programm mit einem Array und die Redundanz ist auch weg. Danke nochmals, das war jetzt echt ein Schritt nach vorn :allright:
Antworten