Argumente in VBA
In die runden Klammern des Aufrufs der Funktion »VBA.Math.Rnd« kann auch ein Ausdruck geschrieben werden.
- Direktbereich
? VBA.Math.Rnd( 9 )
0.533424
Es handelt sich bei »VBA.Math.Rnd( 9 )« um einen Funktionsaufruf, welche in den runden Klammern einen Ausdruck enthält.
Ein Argument ist ein Ausdruck, der zusammen mit dem Funktionsnamen einen neuen Ausdruck bildet. Dies ist dann ein Aufrufausdruck mit einem Argument.
Der Wert des Argumentausdrucks kann den Wert des Aufrufausdrucks mitbestimmen.
Im Falle der Funktion »VBA.Math.Rnd« hat der Wert in den Klammern aber praktisch keinen Einfluß auf das Ergebnisse. Egal, ob man einen Wert in die Klammern schreibt oder nicht: Der Aufruf ergibt immer eine zufällige Zahl zwischen 0 und 1. Dies zeigt schön, daß die aufgerufene Funktion den Argumentwert berücksichtigen kann, aber nicht berücksichtigen muß. Die Angabe der Zahl 9 als Argument ist hier also vollkommen sinnlos, abgesehen davon, daß sie dazu dient, zu zeigen, daß auch Ausdrücke in die Klammern geschrieben werden können.
(Nur, wenn die Zahl in den Klammen nicht-positiv ist, kann man doch einen Einfluß beobachten. Diese Details müssen an dieser Stelle des Kurses aber noch nicht weiter vertieft werden.)
Wir betrachten nun noch eine Funktion, deren Ergebnis durch den Argumentwert bestimmt ist.
- Direktbereich
? VBA.Conversion.Int( 0.0 )
0
? VBA.Conversion.Int( 0.4 )
0
? VBA.Conversion.Int( 0.6 )
0
? VBA.Conversion.Int( 0.9 )
0
? VBA.Conversion.Int( 1.0 )
1
? VBA.Conversion.Int( 0.9 )
0
Der Int-Wert einer Zahl ist die größte ganze Zahl, welche nicht größer als die Zahl ist. So haben die Zahlen 0.0, 0.4, 0.6 und 0.9 beispielsweise alle den Int-Wert 0.
Der Int-Wert einer Zahl ist durch diese Zahl bestimmt. So ist der Int-Wert von »0.9« beispielsweise immer »0«.
Syntax
Wir können die Syntax eines Aufrufausdrucks nun folgendermaßen angeben:
Aufrufausdruck (Syntaxdiagramm)
Aufrufausdruck
.-------------------.
.---------------. .-. | .----------. v .-.
--->| Funktionsname |---.--->( ( )---'--->| Ausdruck |---'--->( ) )---.--->
'---------------' | '-' '----------' '-' ^
'---------------------------------------------'
Ein in die Aufrufklammern geschriebener Ausdruck wird auch Argumentausdruck des Aufrufs oder kurz Argumentausdruck genannt. Die Aufrufklammern, welche das Argument enthalten, werden entsprechend hier auch manchmal als Argumentklammern bezeichnet. Der Wert des Argumentausdruck ist der Argumentwert. Wenn es nicht wichtig ist, zwischen dem Argumentausdruck und Argumentwert zu unterscheiden, so spricht am auch einfach nur von einem Argument. Dann muß dem Zusammenhang entnommen werden, ob damit der Argumentausdruck oder der Argumentwert gemeint ist – manchmal sind auch beide Interpretationen gleichzeitig möglich.
Der Argumentausdruck in einem Aufrufausdruck entspricht dem Operandenausdruck eines Operatorausdrucks mit einem unären Präfixoperator (Vorzeichen). Der Sinn ist derselbe, nur spricht man bei einem Aufrufausdruck eben von einem Argumentausdruck und nicht von einem Operandenausdruck. Beispielsweise entspräche dem Operatorausdruck »-2« der Aufrufausdruck »minus( 2 )« (wenn es eine Funktion »minus« gäbe). Das Argument eines Funktionsaufrufs muß aber im Gegensatz zu dem Operanden eines Operators immer in runde Klammern eingeschlossen werden.
Man kann sich den Sinn eines Arguments auch so erklären: Das Programm (die Funktion) »VBA.Conversion.Int« benötigt noch Informationen, um seine Arbeit tun zu können, und diese Informationen werden durch den Wert des Arguments geliefert. Das Argument enthält die Information, welche die Funktion verarbeiten soll.
Klammerlose Schreibweise
Falls ein Aufruf kein Argument haben soll, so können die leeren Klammern auch entfallen. Diese Schreibweise hat den Vorteil, kürzer zu sein. Der Nachteil besteht darin, daß jetzt nicht mehr schon an den Klammern erkennbar ist, daß es sich um einen Funktionsaufruf handelt.
- Direktbereich
? VBA.Math.Rnd
0.533424
Es sei daran erinnert, daß es bei dieser Funktion normalerweise auch möglich ist, die Qualifikation wegzulassen. Der kürzeste Aufruf sieht also aus wie folgt.
- Direktbereich
? Rnd
0.5863523
Übergabe des Argumentwerts
Da beim Aufruf einer Funktion der Wert des Argumentausdrucks zur Laufzeit zusammen mit der Kontrolle an die aufgerufene Funktion übergeben wird, spricht man auch von der Übergabe des Argumentwertes oder sagt, der Argumentwert werde an die aufgerufene Funktion übergeben.
- »Direktereich« und »Int« bei »VBA.Conversion.Int( 0.4 )«
.--------------------------------------------.
| Direktbereich ---. |
| | Übergabe der Kontrolle |
| V und des Wertes 0,4 |
| .---------------. |
| | Int | |
| '---------------' |
| | |
| | |
|<-----------------' |
| Rueckgabe der Kontrolle |
| und des Wertes 2,0 |
'--------------------------------------------'
Das folgende Diagramm stellt dieselbe Situation mit etwas allgemeineren Begriffen vor.
- Übergabe und Rückgabe der Kontrolle zur Laufzeit
.--------------------------------------------.
| Direktbereich ---. |
| | Übergabe der Kontrolle |
| V und des Argumentwertes |
| .---------------. |
| | Unterprogramm | |
| '---------------' |
| | |
| | |
|<-----------------' |
| Rueckgabe der Kontrolle |
| und des Ergebniswertes |
'--------------------------------------------'
Semantik eines Argumentwertes
Die Bedeutung eines bestimmten Argumentwertes für die Auswertung des Aufrufausdrucks wird durch die aufgerufene Funktion beziehungsweise ihre Dokumentation festgelegt.
Aussprache eines Aufrufausdrucks
Die runde Klammer auf »(« wird im Deutschen [in der Mathematik] bei Verwendung der Funktionsschreibweise meist als „von“ gesprochen. So ist »Int( 0.4 )« „Int von Null-Komma-Vier“ oder „der Int-Wert von Null-Komma-Viert“. Den Ausdruck »cos( 0 )« kann man beispielsweise als „Kosinus von Null“ aussprechen.
Man kann sich den Aufruf »Int( 0.4 )« auch als Frage veranschaulichen: „Was ist der Int-Wert von 0,4?“ – er antwortet dann mit „0,0“.
Erklärung zur Bedeutung von Ausdrücken
Wir hatte Ausdrücke bereits als Texte kennengelernt, welche man in den Ausdruckrahmen einsetzen kann. Danach konnten wir Ausdrücke auch als das charakterisieren, was man als Operand eines Operators schreiben kann. Nun können wir Ausdrücke auch noch dadurch charakterisieren, daß sie als Argumente in Aufrufausdrücken verwendet werden können.
Abbildungsfunktionen
Eine Funktion, welche man mit einem Argument aufrufen kann, und welche einen Wert als Ergebnis liefert, der durch diese Funktion und den Argumentwert bestimmt ist, kann als eine Abbildung im Sinne der Mathematik interpretiert werden. »VBA.Conversion.Int« ist ein Beispiel für solch eine Funktion.
Im Gegensatz dazu ist »VBA.Math.Rnd« beispielsweise keine Abbildungsfunktion, da ihr Wert nicht eindeutig durch den Aufrufausdruck bestimmt ist.
Verschachtelung von Aufrufen
Da ein Aufruf ein Ausdruck ist und ein Argument ein Ausdruck sein muß, darf auch ein Aufruf als Argument verwendet werden. Das folgende Beispiel ergibt immer »0.0«. Es zeigt, daß ein Argumentwert auch ein Laufzeitwert sein darf.
- Beispielausdruck
? VBA.Conversion.Int( VBA.Math.Rnd() )
0
Genauso kann ein Argument auch ein Name sein.
- Beispielausdruck
? VBA.Conversion.Int( VBA.Constants.vbObjectError )
-2147221504
Ein Argument kann auch ein Operatorausdruck sein.
- Beispielausdruck
VBA.Conversion.Int( VBA.Constants.vbObjectError + 2.2 )
-2147221502
Ein Argument kann ein beliebig komplexer Ausdruck sein.
- Beispielausdruck
VBA.Conversion.Int( VBA.Math.Rnd() *( VBA.Constants.vbObjectError + 2.2 ))
-97382415
Anwendung
Wenn eine Funktion mit einem Argument zusammen aufgerufen wird, dann sagt man auch, daß die Funktion auf dieses Argument angewendet werde.
Inkarnation
Wenn eine Funktion auf eine Argument angewendet wird, dann wird eine Verbindung zwischen der Funktion und dem Wert des Arguments hergestellt, die auch als Aktivierungsverbund oder als eine Inkarnation der Funktion bezeichnet wird. Diese Inkarnation wird dann aktiviert, das heißt, daß die Funktion mit dem Argumentwert zusammen gestartet wird.
Operation
Die Funktion wird dann gestartet, und sie kann auf den Argumentwert zugreifen und ihn verarbeiten. Einen solchen Start einer Funktion mit einem bestimmten Argumentwert zusammen nennen wir auch eine Operation einer Funktion.
Operationen (Beispiel)
In diesem Beispiel zeigen wir die einzelnen Operationen, die während der Auswertung des Ausdrucks »VBA.Math.Sqr( VBA.Math.Rnd() / 2. )« ausgeführt werden.
- Der Beispielausdruck
VBA.Math.Sqr( VBA.Math.Rnd() / 2. )
Bevor die erste Funktion »VBA.Math.Sqr« (“square root ”, „Quadratwurzel“) ausgeführt werden kann, muß zunächst der Wert des Arguments »VBA.Math.Rnd() / 2.« ermittelt werden.
Eine Auswertung eines Ausdrucks erfolgt in verschiedenen Schritten. Zu jedem Operator und zu jeder Funktion gehört ein Schritt, der meist einer Funktion oder einem Operator entspricht. Wir nennen diese Schritte hier Operationen.
Operation 0 »VBA.Math.Rnd()«
Der Wert von »VBA.Math.Rnd()« wird erst bei der Auswertung bestimmt und ist hier nicht bekannt. Wir nehmen hier an, daß der Wert von »VBA.Math.Rnd()« gleich »0.705547511577606201171875« ist. (Dies wurde bei einem konkreten Test auch so beobachtet.)
- Funktionsoperation »VBA.Math.Rnd()«
VBA.Math.Sqr( VBA.Math.Rnd() / 2. ) →
VBA.Math.Sqr( 0.705547511577606201171875 / 2. )
Operation 1 » /«
Nachdem nun die Werte der beiden Operanden bekannt sind, kann die Division ausgeführt werden.
- Operatoroperation »0.705547511577606201171875 / 2.«
VBA.Math.Sqr( 0.705547511577606201171875 / 2. ) →
VBA.Math.Sqr( 0.3527737557888031005859375 )
Operation 2 »Sqr«
Nun ist der Wert des Arguments der Funktion »Sqr« ermittelt worden. Damit kann diese Funktion dann mit dem Argumentwert verbunden werden, und diese Verbindung kann dann ausgeführt werden, um schließlich den Wert des gesamten Ausdrucks zu erhalten.
- Funktionsoperation »VBA.Math.Sqr( 0.3527737557888031005859375 )«
VBA.Math.Sqr( 0.3527737557888031005859375 ) →
0.5939476035719002400270483121857978403568267822265625
Die hier sichtbaren vielen Stellen spiegeln den Wert des Ausdrucks unter der verwendeten Implementation genau dar, werden aber normalerweise bei der Ausgabe des Wertes nicht alle angezeigt.
Operationen, Zusammenfassung
Wir haben gesehen, daß während der Auswertung eines Ausdrucks zu jedem in dem Ausdruck verwendeten Funktionsnamen und Operator eine Operation ausgeführt wird. Die Operationen sind die einzelnen Schritte bei der Auswertung eines Ausdrucks. Sie werden zeitlich nicht unbedingt in derselben Reihenfolge hintereinander ausgeführt, in welcher ihre Funktionsnamen oder Operatoren im Quelltext vorkommen.
Weitere Beispiele
Das folgende Programm zeigt den VBA -Ausdruck, welcher der deutschen Nominalphrase „Der Kosinus von 0“ entspricht.
- Direktbereich
? VBA.Math.cos( 0 )
1
Übungsfragen
? Ausdrücke lesen
Was ist der Argumentausdruck in dem Aufrufausdruck »VBA.Conversion.Int( 3.2 )«?
Welchen Wert hat der Aufrufausdruck »VBA.Conversion.Int( 3.2 )«?
? Ausdrücke lesen (1)
Was ist der Argumentausdruck in dem Aufrufausdruck »VBA.Conversion.Int( VBA.Math.Rnd() * 3 )«?
Welche Werte kann dieser Argumentausdruck haben?
Welche Werte kann der Aufrufausdruck »VBA.Conversion.Int( VBA.Math.Rnd() * 3 )« haben?
Sind diese Wert alle annähernd gleich wahrscheinlich? (Zur Beantwortung dieser Frage kann angenommen werden, daß VBA.Math.Rnd() alle möglichen Werte zwischen 0 und 1−2⁻²³ mit gleicher Wahrscheinlichkeit liefert.)
? Ermittlung von Operanden ⃗
Kann es eine Funktion »f« geben, die wie in den folgenden Beispielen gezeigt, den linken Operanden ihres Argumentausdrucks ergibt?
- Direktbereich
f( 1 + 3 )
1
f( 2 + 2 )
2
f( 3 + 1 )
3
Übungsaufgaben
/ Zufallszahlen
Schreiben Sie eine Eingabezeile für den Direktbereich, welche eine Zufallszahl zwischen 0 und 2 mit Nachkommastellen ergibt. Durch wiederholte Eingabe dieser Zeile sollte man einige Zahlen erhalten, die kleiner als 1 sind und einige Zahlen, die größer als 1 sind.
Die Wahrscheinlichkeit für Zahlen kleiner als 1 sollte möglichst ½ sein. Im besten Fall sind alle Werte zwischen 0 und 2 gleichwahrscheinlich (abgesehen vom Wert 2, der selber ausgeschlossen sein sollte).
/ Würfeln
Schreiben Sie eine Eingabezeile für den Direktbereich, welche eine Zahl zwischen 1 und 6 ohne Nachkommastellen ergibt.
Im besten Falle sollten alle möglichen Werte zwischen 1 und 6 gleichwahrscheinlich sein.