Procedureaufruf und Funktionen
  • 13 May 2024
  • 3 Minutes to read
  • Dark
    Light
  • PDF

Procedureaufruf und Funktionen

  • Dark
    Light
  • PDF

The content is currently unavailable in English. You are viewing the default German version.
Article summary

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


Was this article helpful?

What's Next