immer mal wieder brauchte ich eine Procedure, die keine bestimmte Anzahl an Parametern hat, sondern nur viele der gleichen Sorte.
Also versuche ich eine Verallgemeinerung zu schreiben, welche aus vielen unbestimmten Parametern ein Array erzeugt:
Code: Alles auswählen
Macro _O_ : ( : EndMacro
Macro _C_ : ) : EndMacro
Macro MacroRepeat2(F,B)
F#0#B,F#1#B,F#2#B,F#3#B,F#4#B,F#5#B,F#6#B,F#7#B, F#8#B,F#9#B,F#10#B,F#11#B,F#12#B,F#13#B,F#14#B,F#15#B
EndMacro
Macro MacroRepeat3(F,M,B)
F#0#M#0#B:F#1#M#1#B:F#2#M#2#B:F#3#M#3#B:F#4#M#4#B:F#5#M#5#B:F#6#M#6#B:F#7#M#7#B:F#8#M#8#B: F#9#M#9#B:F#10#M#10#B:F#11#M#11#B:F#12#M#12#B:F#13#M#13#B:F#14#M#14#B:F#15#M#15#B
EndMacro
Macro DimP(Parameter, DefaultValue)
MacroRepeat2(Nr,_#Parameter=DefaultValue) )
Dim Parameter(15)
MacroRepeat3(Parameter# _O_, _C_ =Nr, _#Parameter)
Defined(0,0
EndMacro
Syntax
Nun fragt ihr euch bestimmt wie man DimP() nun anwendet, also hier ein paar Beispiele:DimP(Parameter, DefaultValue)
Parameter
Name (mit Typ) des Parameters, welche dann später als Array (mit 16 Feldern 0-15) vorliegt
DefaultValue
Wert mit dem alle Parameter gefüllt werden, falls sie nicht benutzt werden.
größte Zahl
Code: Alles auswählen
Procedure.f Max(DimP(Zahl.f,-1e38))
Protected Max.f = -1e38
For n = 0 To 15
If Zahl(n) > Max
Max = Zahl(n)
EndIf
Next
ProcedureReturn Max
EndProcedure
Debug Max(-120, -23)
Debug Max(293, 234, 34, 34)
Debug Max(1.0,0.2,1.001,0.99)
Strings verbinden
Code: Alles auswählen
Procedure.s Connect(Verbindung.s, DimP(String.s,""))
Protected String.s = String(0)
For n = 1 To 15
If String(n)
String.s + Verbindung + String(n)
EndIf
Next
ProcedureReturn String
EndProcedure
Debug Connect("...", "Das", "ist","ja", "cool")
Array erzeugen und füllen
Code: Alles auswählen
Macro FillArray(ArrayToFill, DimP(Long,0))
Dim ArrayToFill(15)
For n = 0 To 15
ArrayToFill(n) = Long(n)
Next
EndMacro
FillArray(MyArray, 128,255,64,9)
For n = 0 To 15
Debug MyArray(n)
Next
Prozentuales Zufallsergebnis
Code: Alles auswählen
Procedure SpecialRandom(DimP(Percent, 0))
Protected Random = Random(99)
Protected Delta, n
For n = 0 To 15
If Random < Delta+Percent(n)
ProcedureReturn n+1
EndIf
Delta + Percent(n)
Next
ProcedureReturn 0
EndProcedure
Dim Test1(3)
For n = 1 To 10000
Ergebnis = SpecialRandom(60,20,15)
Test1(Ergebnis) + 1
Next
Debug "kein Ergebnis :"+Str(Test1(0))
Debug "Ergebnis 1 :"+Str(Test1(1))
Debug "Ergebnis 2 :"+Str(Test1(2))
Debug "Ergebnis 3 :"+Str(Test1(3))