BREAK BY oder ähnlicher Befehl in Purebasic

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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

Re: BREAK BY oder ähnlicher Befehl in Purebasic

Beitrag von NicTheQuick »

Mit Pointern geht das so:

Code: Alles auswählen

; Parameter für Liste erzeugen
Structure inhalt
	artikel.s
	sortiment.s
EndStructure

Global NewList sortiment.inhalt()

Procedure newArt(artikel.s, sortiment.s)
	AddElement(sortiment())
	sortiment()\artikel = artikel
	sortiment()\sortiment = sortiment
EndProcedure

newArt("Salami", "Fleisch")
newArt("Schinken", "Fleisch")
newArt("Apfel", "Obst")
newArt("Birne", "Obst")
newArt("Radeberger", "Bier")
newArt("Becks", "Bier")

SortStructuredList(sortiment(), #PB_Sort_Ascending, OffsetOf(inhalt\sortiment),#PB_String)
Define *previous.inhalt = 0 ;Pointer zum letzten Element, initialisieren mit 0

ForEach sortiment()
	If (*previous <> 0 And *previous\sortiment <> sortiment()\sortiment)
		Debug *previous\sortiment + " --> " + sortiment()\sortiment
		*previous\artikel + " (das letzte!)" ; Nochmal nachträglich ändern
	EndIf
	*previous = @sortiment() ;Setze Pointer auf das aktuelle Element, damit es im nächsten Durchlauf als das vorherige benutzt werden kann
Next

Debug ""
Debug "Nochmal alle Artikel ausgeben:"
ForEach sortiment()
	Debug sortiment()\artikel
Next
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: BREAK BY oder ähnlicher Befehl in Purebasic

Beitrag von Drago »

Also, ich weis ja nicht. Kann sein das ich es falsch verstanden habe, aber ich poste mal sowieso trotzdem...

Code: Alles auswählen

; Parameter für Liste erzeugen
Structure inhalt
     artikel.s
     sortiment.s
EndStructure

Global NewList sortiment.inhalt()
Global Dim SortimentenListe.s( 100 )
Global count.i

AddElement(sortiment())
sortiment()\artikel = "12334uiu"
sortiment()\sortiment = "Fleisch"

AddElement(sortiment())
sortiment()\artikel = "8235408280458"
sortiment()\sortiment = "Fleisch"

AddElement( sortiment() )
sortiment()\artikel = "F894059432"
sortiment()\sortiment = "Fleisch"

AddElement(sortiment())
sortiment()\artikel = "28742973549"
sortiment()\sortiment = "Obst"

AddElement(sortiment())
sortiment()\artikel = "134542976579"
sortiment()\sortiment = "Gemüse"

AddElement(sortiment())
sortiment()\artikel = "7893412347"
sortiment()\sortiment = "Tiefkühlkost"

AddElement(sortiment())
sortiment()\artikel = "K7893412347"
sortiment()\sortiment = "Konserven"

AddElement(sortiment())
sortiment()\artikel = "1082485023"
sortiment()\sortiment = "Obst"


Procedure GetList()
     
     Protected  i.i, Position1.i, Position2.i, Found.b, Text1.s    
     
     count = 0
     
     ForEach sortiment()
          
          With sortiment()
               
               Position = ListIndex( sortiment() ); aktuelle Position mergen
               
               Text1 = sortiment()\sortiment; das aktuelle Sortiment holen
               
               PushListPosition( sortiment() ); Listenposition mergen
               
               ForEach  sortiment(); Und die Liste nochmal durchlaufen
                    
;==========================================================                    
                    ; prüfen ob es das aktuelle Element aus der ersten Prüfung ist
                    ; um zu vermeiden das man ein Element mit sichselbstvergleicht
                    Position2 = ListIndex( sortiment() )
                    
                    If Position1 = Position2
                         
                         Continue; Jo, isse das gleiche, also überspringen wir es
                         
                    EndIf
;===========================================================                    
                    If   \sortiment <> Text1; prüfen auf den Inhalt
                         
; Flag setzen womit wir überprüfen, ob wir das Sortiment schon in der Liste haben
                         Found = #False
                         
                         For i = 0 To count; Unser Array durchlaufen 
                              
                              If SortimentenListe( i ) = \sortiment
                                   Found = #True; ist schon vorhanden
                                   Break
                              EndIf
                              
                         Next
                         
                         If Found = #False; war nicht im Array
                              SortimentenListe( count ) = \sortiment; also abspeichern
                              count + 1
                         EndIf
                         
                    EndIf
                    
               Next
               
               PopListPosition( sortiment() );Listenzeiger wieder setzten
               
          EndWith  
          
     Next    
     For i = 0 To count 
          Debug SortimentenListe( i )
     Next
     
EndProcedure

Procedure FoundLast()
     GetList()
     Protected ii.i, countlist.i, i.i
     
     countlist = ListSize( sortiment() ) - 1
     
     For i = 0 To count    
     
          For ii = countlist To 0 Step -1
               
          SelectElement( sortiment(), ii )
          
          If sortiment()\sortiment = SortimentenListe( i )
               ; Hier stände dann der Code den du dann ausführen möchtest
               ; oder so in etwa
               Debug "Letzter Eintrag des Sortimentes : " + sortiment()\sortiment + " an Listenposition " + Str( ii )
               Debug "Artikel      : " + sortiment()\artikel
               
               Debug "------------------------------"
               Break    
               
         EndIf
          
     Next
     
Next    
     
EndProcedure

FoundLast()

Antworten