DimP - Viele ProcedurParameter (max 16) als Array verwenden

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

DimP - Viele ProcedurParameter (max 16) als Array verwenden

Beitrag von STARGÅTE »

Tachchen,

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
Info: es ist absicht das die Klammersetzung hier "falsch" ist, damit das Macro richtig bearbeitet wird.

Syntax
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.
Nun fragt ihr euch bestimmt wie man DimP() nun anwendet, also hier ein paar Beispiele:


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))
Zuletzt geändert von STARGÅTE am 05.01.2009 02:33, insgesamt 1-mal geändert.
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
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Beitrag von Hyper »

Stark!

Ist also immer dann von Nutzen, wenn man Funktionen hat, bei denen eine unbestimmte Anzahl gleich typisierter Variablen Input sind.
Das müsste doch auch mit strukturierten Arrays klappen oder?

PS: Frohes Fest Euch allen :)
PB 5.72
Antworten