Wie fragt man Einzelwerte in einer List ab?

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

Wie fragt man Einzelwerte in einer List ab?

Beitrag von Re57 »

Hallo, ich habe heute das Vergnügen, mich erstmals mit List zu beschäftigen, aber die Listenwerte lassen sich dann nur an Position Null abfragen, ansonsten Fehlermeldung. Folgendes soll passieren. Bei jedem Klick erhöht sich der Wert stp um 1. Außerdem kommen bei jedem Klick immer andere ast-Werte rein, und die sollen an einer Position nach der anderen in der List gespeichert werden. Und dann vor allem aber auch schön einzeln wieder abgefragt werden können. Und wie geht das dann? Hier der Code:

Code: Alles auswählen

 stp = stp + 1
              NewList ast.l()
              Select stp
              Case 1
              AddElement(ast())
              ast() = ast
              
              Case 2
              AddElement(ast())
              ast() = ast
              
              Case 3
              AddElement(ast())
              ast() = ast
            EndSelect

Das List-Kapitel im Handbuch habe ich ja gelesen, aber in meinem Beispiel wird die Liste Stück für Stück belegt, das ist der Unterschied. Danke für Info.
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: Wie fragt man Einzelwerte in einer List ab?

Beitrag von NicTheQuick »

Könntest du das etwas genauer erklären. Ich fürchte ich weiß noch nicht genau, was nicht klappt.

Suchst du SelectElement()?
Bild
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Re57 »

Genau. Wenn ich hinschreibe

Code: Alles auswählen

SelectElement(ast(),0)
            Debug Val(Str(ast()))
kann das abgefragt werden, aber bei jeder anderen Position, Fehlermeldung "The list doesn't have a current element".
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: Wie fragt man Einzelwerte in einer List ab?

Beitrag von NicTheQuick »

Aus deinem Code-Schnipsel ist auch nicht ersichtlich, dass du mehr als ein Element hinzufügst.
Wenn dir ListSize(ast()) nur 1 zurückgibt, dann geht auch nur SelectElement(ast(), 0) und kein anderer Index.

Zeig uns mal einen kompletten Code, damit man besser versteht, was du eigentlich machst.
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von mk-soft »

Ich glaube ein Array (Dim) passt da besser. Habe meine Kristall Kugel gefragt
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Re57 »

Der komplette Code ist viel zu lang und um den soll es auch gar nicht gehen. Ich habe dann die ganze List-Geschichte überhaupt erst gar nicht kappiert.

Nochmal kurz gesagt: Die Anzahl der Klicks wird gezählt und zu jedem Klick 1,2,3,4,5 usw. soll ein sich ändernder Wert an einem List-Platz nach dem anderen gespeichert werden, das können jetzt irgendwelche Zufallswerte sein, völlig egal. Und wenn dann z.B. 8 Werte in der Liste gespeichert sind, sollen die auch wieder abgefragt werden können. Sicher könnte man das auch mit einem Array machen, aber auch das kappiere ich nicht im Handbuch. Mir kann also auch gerne mal jemand erklären, wie meine obige Aufgabenstallung mit einem Array zu packen wäre, Hauptsache, ich kappiere wenigstens mal eins von beidem, entweder List oder Array. Danke.
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Andesdaf »

zum Vergleichen...

Code: Alles auswählen

EnableExplicit

Define.i iEvent,
         i
Define NewList Klicks.i()

If OpenWindow(0, 0, 0, 300, 300, "", #PB_Window_ScreenCentered)
  ButtonGadget(0, 5, 5, 100, 25, "Klick")
  ButtonGadget(1, 5, 35, 100, 25, "Abfrage")
  ButtonGadget(2, 5, 65, 100, 25, "Abfrage anders")
EndIf

Repeat
  iEvent = WaitWindowEvent()
  
  Select iEvent
    Case #PB_Event_Gadget
      Select EventGadget()
        
        Case 0
          AddElement(Klicks())
          Klicks() = Random(500, 0)
        
        Case 1
          ForEach Klicks()
            Debug "Klick Nr. " + ListIndex(Klicks()) + " erzeugte die Zufallszahl " + Str(Klicks())
          Next
          
        Case 2
          For i = 0 To ListSize(Klicks()) - 1
            SelectElement(Klicks(), i)
            Debug "Klick Nr. " + Str(i) + " erzeugte die Zufallszahl " + Str(Klicks())
          Next i
        
      EndSelect
    
  EndSelect
  
Until iEvent = #PB_Event_CloseWindow

CloseWindow(0)
Win11 x64 | PB 6.00 (x64)
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Re57 »

Den ursprünglichen Beitrag habe ich wieder entfernt.
Zuletzt geändert von Re57 am 20.05.2020 09:38, insgesamt 1-mal geändert.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Mijikai »

Array Beispiel:

Code: Alles auswählen

EnableExplicit

Structure COLLECT_STRUCT
  count.i
  Array item.i(127)
EndStructure

Global collect.COLLECT_STRUCT
Global index.i
Global element.i

Procedure.i ListAdd(*collect.COLLECT_STRUCT,Item.i)
  Protected siz.i
  With *collect
    If \count = (ArraySize(\item()) + 1)
      siz = \count + 128
      ReDim \item(siz)
      If ArraySize(\item()) = siz
        \item(\count) = Item
        \count + 1
        ProcedureReturn #True
      Else
        ProcedureReturn #False  
      EndIf      
    Else
      \item(\count) = Item
      \count + 1
      ProcedureReturn #True
    EndIf
  EndWith
EndProcedure

Procedure.i ListElement(*collect.COLLECT_STRUCT,Index.i,*Result.Integer)
  With  *collect
    If Index > -1 And Index < \count
      *Result\i = \item(Index)
      ProcedureReturn #True
    Else
      ProcedureReturn #False
    EndIf
  EndWith
EndProcedure

For index = 0 To 1000
  If Not ListAdd(@collect,index)
    MessageRequester(#Null$,"Error: Not enough memory!")
    End
  EndIf
Next

If ListElement(@collect,12,@element);get the element @ index 12
  Debug element
EndIf

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

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Re57 »

Vielen Dank für die beiden Codes, aber leider nutzen die mir beide nichts. Prozeduren gehen ja nicht in Repeat-Schleifen und außerdem habe ich mit Prozeduren auch noch nie gearbeitet. Solange es keine einfache Möglichkeit gibt, Arrays oder Listen erstellen und dann auch wieder abfragen zu können, kann ich darauf verzichten. Oder das Handbuch wird da endlich mal gescheit aufbereitet. Da ist wahrscheinlich bei den Erklärungen für List und Array null etwas nachbereitet worden seit PureBasic 4.00 Zeiten oder noch früher, das ist so schlichtweg nicht anbietbar.
Antworten