Da ich nun eine Warteschlange gebraucht habe wollte ich es diesmal etwas universeller angehen.
Ich spiele zur Zeit gerne mit Macros herum, kenne die maximale Größe und mag keine dynamischen Speicher.
Deswegen sieht das Ergebnis auf den ersten Blick ähnlich aus.
Diesmal habe ich mich aber dafür entschieden Indizes zu speichern statt die Position zu nutzen und nur die Reihenfolge in die Felder zu schreiben.
Ein weiterer Unterschied ist, dass es sich um einen Ring handelt den man als Stapel und als Warteschlange nutzen kann.
Im Nachhinein frage ich mich ob eine einfach Umsetzung als Muster für den jeweiligen Anwendungsfall nicht eine bessere Idee gewesen wäre als das "Universalmacro".
Vielleicht kann es ja trotzdem jemand brauchen.
Code: Alles auswählen
Macro Ring(Name, Elements) : Dim Name(Elements+2) : Name(0)=Elements : EndMacro ; Elements, First, Used, Datafields
Macro RingElements (Name) : Name(0) : EndMacro
Macro RingFirst (Name) : Name(1) : EndMacro
Macro RingUsed (Name) : Name(2) : EndMacro
Macro RingFree (Name) : RingElements (Name)-RingUsed (Name) : EndMacro
Macro RingNext (Name) : ((RingFirst (Name)+RingUsed (Name))%RingElements (Name))+3 : EndMacro
Macro RingLast (Name) : ((RingFirst (Name)+RingUsed (Name)-1)%RingElements (Name)) : EndMacro
Macro RingEnter (Name, Value): Name(RingNext (Name)) = Value : RingUsed (Name) = RingUsed (Name) +1 : EndMacro ; use "If RingFree()"
Macro RingPush (Name, Value): Name(RingNext (Name)) = Value : RingUsed (Name) = RingUsed (Name) +1 : EndMacro ; use "If RingFree()"
Macro RingFront (Name) : Name(RingFirst (Name)+3) : EndMacro
Macro RingTop (Name) : Name(RingLast (Name)+3) : EndMacro
Macro RingLeave (Name): RingUsed (Name) = RingUsed (Name) -1 : RingFirst (Name) = ((RingFirst (Name)+1)%RingElements (Name)) : EndMacro ; use "If RingUsed"
Macro RingPop (Name, Variable): Variable = RingTop (Name) : RingUsed (Name) = RingUsed (Name) -1 : EndMacro ; use "If RingUsed"
; Test
Macro RingTestA (Name, Operation)
Debug "E F U 0 1 2 3 4"
Debug Str(RingElements (Name))+" "+Str(RingFirst (Name))+" "+Str(RingUsed (Name))+" "+Str(Name(3))+" "+Str(Name(4))+" "+Str(Name(5))+" "+Str(Name(6))+" "+Str(Name(7))+" "+Operation
EndMacro
Macro RingTestB (Name)
Debug Str(RingElements (Name))+" "+Str(RingFirst (Name))+" "+Str(RingUsed (Name))+" "+Str(Name(3))+" "+Str(Name(4))+" "+Str(Name(5))+" "+Str(Name(6))+" "+Str(Name(7))
Debug""
EndMacro
Macro NotPossible : Debug ">>> not possible !" : Debug "" : EndMacro
Ring(Test,5)
If RingFree(Test) : RingTestA (Test, "RingPush (Test, 1)") : RingPush (Test, 1) : RingTestB (Test) : Else : RingTestA (Test, "RingPush (Test, 1)") : NotPossible : EndIf
If RingFree(Test) : RingTestA (Test, "RingPush (Test, 2)") : RingPush (Test, 2) : RingTestB (Test) : Else : RingTestA (Test, "RingPush (Test, 2)") : NotPossible : EndIf
If RingFree(Test) : RingTestA (Test, "RingPush (Test, 3)") : RingPush (Test, 3) : RingTestB (Test) : Else : RingTestA (Test, "RingPush (Test, 3)") : NotPossible : EndIf
If RingFree(Test) : RingTestA (Test, "RingPush (Test, 4)") : RingPush (Test, 4) : RingTestB (Test) : Else : RingTestA (Test, "RingPush (Test, 4)") : NotPossible : EndIf
If RingFree(Test) : RingTestA (Test, "RingPush (Test, 5)") : RingPush (Test, 5) : RingTestB (Test) : Else : RingTestA (Test, "RingPush (Test, 5)") : NotPossible : EndIf
If RingFree(Test) : RingTestA (Test, "RingPush (Test, 6)") : RingPush (Test, 6) : RingTestB (Test) : Else : RingTestA (Test, "RingPush (Test, 6)") : NotPossible : EndIf
Debug Str(RingFront (Test))+" RingFront (Test)" : Debug""
Debug Str(RingTop (Test))+" RingTop (Test)" : Debug""
If RingUsed(Test) : RingTestA (Test, "RingLeave (Test)") : RingLeave (Test) : Test(3) = 0 ; not necessary - only for demo
RingTestB (Test) : Else : RingTestA (Test, "RingLeave (Test)") : NotPossible : EndIf
If RingUsed(Test) : RingTestA (Test, "RingPop (Test, x)") : RingPop (Test, x) : Test(7) = 0 ; not necessary - only for demo
Debug "x = "+Str(x) : RingTestB (Test) : Else : RingTestA (Test, "RingPush (Test, 6)") : NotPossible : EndIf
Debug Str(RingFront (Test))+" RingFront (Test)" : Debug""
Debug Str(RingTop (Test))+" RingTop (Test)" : Debug""
If RingFree(Test) : RingTestA (Test, "RingEnter (Test, 7)") : RingEnter (Test, 7) : RingTestB (Test) : Else : RingTestA (Test, "RingEnter (Test, 7)") : NotPossible : EndIf
If RingFree(Test) : RingTestA (Test, "RingEnter (Test, 8)") : RingEnter (Test, 8) : RingTestB (Test) : Else : RingTestA (Test, "RingEnter (Test, 8)") : NotPossible : EndIf