- 13 May 2024
- 3 Minuten zu lesen
- Drucken
- DunkelLicht
- pdf
Procedureaufruf und Funktionen
- Aktualisiert am 13 May 2024
- 3 Minuten zu lesen
- Drucken
- DunkelLicht
- pdf
Desto umfangreicher und komplexer ein Programmcode wird, desto länger wird er meistens auch. Dadurch können sehr lange Makros entstehen, welche mit der Zeit immer unübersichtlicher werden (Spaghetti-Code). Um dies zu vermeiden und eine Wieder-verwendbarkeit zu erreichen, ist es ratsam, oftmals benötigte Routinen zusammenzufassen. Dieses ist im visuellen Parametersystem durch Prozeduren und Funktionen realisierbar.
Prozeduren
Procedure definiert eine Prozedur, die in verschiedenen Makros aufgerufen werden kann und besitzt folgende Syntax:
PROCEDURE ProcName
[DEFINE PARAMETER [INPUT|OUTPUT|INPUTOUTPUT] ... ]
Befehl1
Befehl2
.
.
END
ProcName ist der Name der Prozedur. Befehl1, Befehl2, etc. sind Anweisungen, die innerhalb der Prozedur ausgeführt wird. Für eine Prozedur können auch Parameter definiert werden (alle Typen), ihre Lebensdauer erstreckt sich auf die Prozedur. Alle Parameter werden ohne Angabe von INPUT, OUTPUT oder INPUTOUTPUT wie INPUT behandelt, d.h. Call-By-Value(). Der Aufruf einer Prozedur erfolgt mit RUN und muß immer mit dem Bibliotheksnamen qualifiziert sein, da sonst nach einer internen Prozedur gesucht wird.
! Die Prozedur GetProzTyp1 errechnt 15% von Brutto
! und liefert das Ergebnis auf der Variable Steuer zurück
PROCEDURE GetProzTyp1
DEFINE PARAMETER INPUT Brutto, INPUTOUTPUT Steuer
!DEFINE PARAMETER INPUT Brutto, Steuer !Steuer wäre automatisch INPUT
Steuer = Brutto * 0.15 ! 15%
END
Funktionen
Function definiert eine Funktion, die verborgen für das aufrufende Makro einen Wert ermittelt und an mehreren Stellen aufgerufen, d.h. verwendet werden kann. Eine Funktion kann auch wie ein Variablenname in einen Ausdruck eingebunden werden und sieht so aus:
FUNCTION FuncName
[DEFINE PARAMETER [INPUT|OUTPUT|INPUTOUTPUT] ... ]
Befehl1
Befehl2
.
.
RETURN Rückgabewert
END
FuncName ist der Name der Funktion. Er darf nicht identisch mit dem Name einer numerischen oder Zeichenkettenfunktion sein. Befehl1, Befehl2, etc. sind Anweisungen, die innerhalb der Funktion ausgeführt werden. Rückgabewert ist der Wert, der mit RETURN zurückgegeben und im aufrufenden Makro einer Variablen übergeben wird.
Für eine Funktion können INPUT Parameter vereinbart werden, um bestimmte Werte aus der aufrufenden Routine in der Funktion weiterzuverarbeiten. OUTPUT Parameter können ebenfalls vereinbart werden; für den Ausgabewert steht jedoch RETURN zur Verfügung und sollte deshalb auch verwendet werden.
Bei mehreren Rückgabewerten sollte lieber eine Prozedur benutzt werden!
Beispiele für Funktionen
/* 1 2 3 5 8 13 21 34 ….
Fibonacci(4) = 5, Fibonacci(7) = 13 */
FUNCTION Fibonacci
DEFINE PARAMETER INPUT n
IF n = 0 THEN
RETURN(0)
ENDIF
IF n = 1 THEN
RETURN(1)
ENDIF
IF n > 1 THEN
RETURN(Fibonacci(n - 1) + Fibonacci(n - 2))
ENDIF
END
/* 1 2 6 24 120 …
Fakultaet(3) = 6, Fakultaet(4) =24, … */
FUNCTION Fakultaet
DEFINE PARAMETER INPUT n
IF n = 0 OR n=1 THEN
RETURN(1)
ENDIF
IF n > 1 THEN
RETURN(n*fakultaet(n-1))
ENDIF
END
FUNCTION WertMalZwei
DEFINE PARAMETER INPUT wert
RETURN(wert * 2)
END
FUNCTION WertMalDrei
DEFINE PARAMETER INPUT wert
RETURN(wert * 3)
END
FUNCTION AddiereMultiplizierteWerte
DEFINE PARAMETER INPUT wert1, wert2
RETURN(WertMalZwei(wert1) + WertMalDrei(wert2))
END
Variable Anzahl an Argumenten bei Prozeduren/Funktionen
Es besteht die Möglichkeit bei Prozeduren oder Funktionen die Anzahl der Parameter variabel zu gestalten. Dies geschieht in der DEFINE PARAMETER Zeile durch eine Zuweisung eines Standardwertes bei einem Übergabeparameter. Ab diesem Parameter sind alle folgenden optional!
Beispiel:
DEFINE VARIABLE Erg, va, vb, vc, vd, ve, vf
Erg = 0
va = Erg + 1 !1
vb = va + 1 !2
vc = vb + 1 !3
vd = vc + 1 !4
ve = vd + 1 !5
vf = ve + 1 !6
RUN AddNumbers(Erg,va) !Erg = 1
MESSAGE Erg
RUN AddNumbers(Erg,va,vb) !Erg = 3
MESSAGE Erg
RUN AddNumbers(Erg,va,vb,vc) !Erg = 6
MESSAGE Erg
RUN AddNumbers(Erg,va,vb,vc,vd) !Erg = 10
MESSAGE Erg
RUN AddNumbers(Erg,va,vb,vc,vd,ve) !Erg = 15
MESSAGE Erg
Es können zwar noch mehr Parameter übergeben werden, allerdings können diese nicht mehr verarbeitet werden. Die Anzahl der Parameter die übergeben werden können leider nicht festgestellt werden wie in anderen Sprachen üblich, d.h. man muss selber dafür Sorge tragen in wie weit man die Anzahl ausreizt. In unserem Fall macht es bis zu 6 Parametern Sinn und der jetzige Aufruf macht nicht mehr das was er sollte!
RUN AddNumbers(Erg,va,vb,vc,vd,ve,vf)
MESSAGE Erg !Wieder 15 da in der Prozedur mit pN5 = 0 kein pN6 = 0 mehr steht und diese Variable auch nicht zum Ergebnis hinzugezählt wird!
!Prozedur mit variabler Anzahl an Parametern
!2 Parameter sind notwendig, ab dem dritten sind die variabel
PROCEDURE AddNumbers
DEFINE PARAMETER INPUTOUTPUT pErg, pN1, pN2 = 0, pN3 = 0, pN4 = 0, pN5 = 0
pErg = pN1 + pN2 + pN3 + pN4 + pN5
END