Variablendefinition a'la ListIconGadget

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Variablendefinition a'la ListIconGadget

Beitrag von Bisonte »

Hallo.

Ich steh grad mal wieder wie der Ochs vorm Berg, oder das berühmte Schwein vor dem Uhrwerk und sehe
womöglich den Wald vor lauter Bäumen nicht.

Ich habe folgendes Problem :

Wie definiere ich Variablentechnisch in PB eine Tabelle, mit der ich die PB internen Sort... Befehle nutzen kann,
wobei die Integrität der Tabelle bestehen bleibt, UND ich die Anzahl der Zeilen und Spalten vorher nicht kenne ?

Beispieltabelle :

Code: Alles auswählen

;:-       Col1   Col2   Col3   ...
;:- Row1  Value  Value  Value  ...
;:- Row2  Value  Value  Value  ...
;:- Row3  Value  Value  Value  ...
;:- Row4  Value  Value  Value  ...
;:- Row5  Value  Value  Value  ...
;:- ...   ...    ...    ...    ...
Wenn ich nun die Spalte Col2 sortiere, sollen natürlich alle Werte von Col1 und Col3 ebenfalls abhängig zur Col2
ihre Position innerhalb der Tabelle einnehmen.

Ich dachte mir, "Hey da nehm ich ein mehrdimensionales Array...", aber das kann man leider nicht redimensionieren (zumindest nicht alles :
Also nur die letzte Dimension.

Welchen Mix aus Arrays, Listen, Maps wie auch immer brauch ich hier... ?
Wie macht es das ListIconGadget ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Variablendefinition a'la ListIconGadget

Beitrag von STARGÅTE »

Bisonte hat geschrieben:ch dachte mir, "Hey da nehm ich ein mehrdimensionales Array...", aber das kann man leider nicht redimensionieren (zumindest nicht alles :
Also nur die letzte Dimension.
Das ist richtig, wenn du wirklich ReDim nutzen willst/musst.
Du kannst dein mehrdimensionales Array aber trotzdem normal mit Dim neue Dimensionen geben.
Den Inhalt musst du dabei halt kopieren.

Da du aber auch sortieren willst, würde ich vermutlich eine List-List Structur nutzen:

Code: Alles auswählen

Structure Row
  List Field.Value()
EndStructure

Structure Table
  List Row.Row()
EndStructure
Zum sortieren kannst du dann CustomSortList() nutzen. Dort kannst du in der Vorschrift für die Sortierung (Callback) definieren welches Feld/Spalte wie verglichen werden soll. Bei der Sortierung wird dann immer das ganze Element (also die ganze Zeile) verschoben.
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
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Variablendefinition a'la ListIconGadget

Beitrag von Bisonte »

Danke.

Mit dem CustomSortList() bin zwar etwas überfordert (ich raff das grad nicht so wirklich wie das geht)
aber das mit dem kopieren hat mich in eine funktionierende Richtung geschubst.

Ist zwar nicht perfekt, aber ein Ansatz mit Funktion ;) (Könnte bei grösseren Listen wohl etwas länger dauern....)

Code: Alles auswählen

EnableExplicit

Structure table_data
  Value.s
EndStructure
Structure row_data
  sValue.s
  Array Table.table_data(1)
EndStructure
Structure col_data
  List Row.row_data()
EndStructure

Procedure Sorter(*SL.col_data, Column)
  
  If ListSize(*SL\Row())
    If Column >= 0 And Column <= ArraySize(*SL\Row()\Table())
      ForEach *SL\Row()
        *SL\Row()\sValue = *SL\Row()\Table(Column)\Value  
      Next
      SortStructuredList(*SL\Row(), #PB_Sort_Ascending, OffsetOf(row_data\sValue), TypeOf(row_data\sValue))
    EndIf
  EndIf
  
EndProcedure
Procedure AddRow(List SL.row_data(), Columns)
  
  AddElement(SL())
  Dim SL()\Table(Columns)
    
EndProcedure

Define Tabelle.col_data

AddRow(Tabelle\Row(), 3)
Tabelle\Row()\Table(1)\Value = "ZZ Top" : Tabelle\Row()\Table(2)\Value = "La Grange" : Tabelle\Row()\Table(3)\Value = "1973" 

AddRow(Tabelle\Row(), 3)
Tabelle\Row()\Table(1)\Value = "Abba" : Tabelle\Row()\Table(2)\Value = "Chiquita" : Tabelle\Row()\Table(3)\Value = "1979"

AddRow(Tabelle\Row(), 3)
Tabelle\Row()\Table(1)\Value = "Frank Zappa" : Tabelle\Row()\Table(2)\Value = "Bobby Brown" : Tabelle\Row()\Table(3)\Value = "1980"

AddRow(Tabelle\Row(), 3)
Tabelle\Row()\Table(1)\Value = "Pink Floyd" : Tabelle\Row()\Table(2)\Value = "The Wall" : Tabelle\Row()\Table(3)\Value = "1979"

ForEach Tabelle\Row()
  With Tabelle\Row()
    Debug LSet(\Table(1)\Value, 20, " ") + LSet(\Table(2)\Value, 20, " ") + LSet(\Table(3)\Value, 20, " ") 
  EndWith
Next
Debug LSet("-", 60, "-")

Sorter(@Tabelle, 3)

ForEach Tabelle\Row()
  With Tabelle\Row()
    Debug LSet(\Table(1)\Value, 20, " ") + LSet(\Table(2)\Value, 20, " ") + LSet(\Table(3)\Value, 20, " ") 
  EndWith
Next
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten