Peter Lorenz English smaller fonts Simulation und Animation

3.1. Konstanten und Ampervariablen

In GPSS/H gibt es wie in vielen anderen Programmiersprachen einige Typen von Werten. Jede Konstante und jede Variable gehört zu einem dieser Typen. Die im GPSS/H eingeführten Variablen heißenAmpervariablen, weil ihre Namen mit &(Ampersand) beginnen. Das hat historische Ursachen: Der Name Variable war bereits in früheren Versionen belegt.
Die Voranstellung des & vor den Variablennamen hat mit der nachträglichen Einführung einer Programmiersprache in das alte GPSS-Konzept zu tun. & wird zur Unterscheidung der neu eingeführten Variablen von anderen Objektsymbolen benötigt.
Ampervariablen unterscheiden sich im GPSS/H von Variablen und der Steueranweisung VARIABLE. Variablen kommen aus dem alten GPSS-Konzept und werden im Abschnitt 3.7. eingeführt. Sie sind Formelfunktionen oder Abkürzungen für Ausdrücke.

3.1.1. Typen von Werten return

Die folgende Tabelle informiert über die im GPSS/H verfügbaren Typen von Werten, die von Konstanten, Ampervariablen, Ausdrücken, Funktionen und Variablen und anderen Größen angenommen werden können.

Typ Wertebereich Beispiel
Logisch 0 ; 1 0 steht für Falsch, 1 für Wahr
Ganzzahlig -231 .. 231-1 98765
Reellwertig rechnerabhängig 3.21, -0.12E15,
Zeichenkette Beliebige ASCII-Zeichenfolge 'Hallo'

Die ganzzahligen Werte werden im klassischen GPSS-Sprachkonzept weiter in folgender Weise unterteilt:

Ganzzahlig Wertebereich
Byte -27 .. 27-1
Halbwort -215 .. 215-1
Vollwort -231 .. 231-1

Diese Unterteilung wird erst im 4. Kapitel in Verbindung mit Skalaren, Matrizen und Parametern zu beachten sein.

3.1.2. Konstantenreturn

Konstanten werden im allgemeinen durch ihre Werte präsentiert und besitzen keine Namen.

Ganzzahlige Konstanten können mit + oder - beginnen. Darauf folgen maximal 10 Ziffern.

Reellwertige Konstanten haben folgendes Format:

Vorzeichen ganzzahliger Teil gebrochener Teil Exponent
[- oder +] {0 bis 10 Ziffern} . {0 bis 10 Ziffern} [E [Vorzeichen] {0-2 Ziffern}]

Obwohl reellwertige Konstanten maximal 20 Ziffern enthalten dürfen, ist ihre Genauigkeit dadurch begrenzt, dass sie als Gleitkommazahlen mit doppelter Genauigkeit gespeichert werden. Damit haben sie etwa 16 gültige Dezimalstellen.

Beispiele für reellwertige Konstanten
Zulässig Unzulässig Kommentar
1.21.2.3 mehr als ein Punkt
.34.5+6 E fehlt
4E20 1E70 Exponent zu groß
-5E-6 12345678901.1 zu viele Stellen
7.8E9 .12345678901 zu viele Stellen
Zeichenkettenkonstanten beginnen und enden mit einem Apostroph. Sie dürfen beliebig lang sein. Wenn sie nicht auf eine Zeile passen, dürfen sie mit _ (underline) fortgesetzt werden. Aus diesem Grunde darf '_' nicht in Zeichenketten benutzt werden.
Wenn ein Apostroph in einer Zeichenkette vorkommen soll, muß es doppelt geschrieben werden, z.B. 'don''t'.

Positive ganzzahlige Konstanten können einen Namen erhalten, der den GPSS/H-Konventionen entspricht: Er muß mit einem Großbuchstaben beginnen und darf nur aus Großbuchstaben und Ziffern bestehen. Mehr als 8 Zeichen sind nicht zugelassen. Der Name darf nicht mit einer Zeichenfolge beginnen, die gleichzeitig als Standardattribut definiert ist.

Eine explizite Zuordnung von Namen und Nummern (=positive ganze Zahlen) wird durch Ausführung der EQU-Anweisung vorgenommen.

EQU
ist eine Compilerdirektive. Im GPSS/H werden drei Anweisungsklassen unterschieden: Compilerdirektiven, die während der Compilierung ausgeführt werden, Steueranweisungen und Blöcke. Die syntaktische Beschreibung lautet
name EQU wert.
Durch
VIERZIG EQU 40

wird dem Namen VIERZIG der Wert 40 zugeordnet. Diese Zuordnung läßt sich während der Laufzeit des Programms nicht mehr ändern. Eine vollständige Beschreibung der EQU-Direktive findet man im Abschnitt 3.3.

3.1.3. Ampervariablenreturn

Namen von Ampervariablen

Der Name einer Ampervariablen besteht aus dem Zeichen &, dem unmittelbar ein Name folgt. Der Name enthält 1 bis 8 alphanumerische Zeichen, von denen das erste ein Großbuchstabe sein muß. Die weiteren Zeichen müssen Großbuchstaben oder Ziffern sein.

Weiter unterliegen die als Ampervariablen benutzten Symbole keinen Einschränkungen. (Der Compiler überprüft nicht, ob der führende Buchstabe mit einem numerischen oder logischen Standardattribut (NSA oder LSA) übereinstimmen.

Typen und Typdeklarationreturn

Es gibt fünf Typen von Ampervariablen: INTEGER, REAL, CHAR*n, VCHAR*n und EXTERNAL. Mit Ausnahme des Typs EXTERNAL können Ampervariablen entweder skalare Variablen oder eindimensionale Felder sein.

Ampervariablen vom Typ INTEGER und REAL haben eine starke Ähnlichkeit mit den Variablen dieser Typen in höheren Programmiersprachen.
CHAR*n- bzw. VCHAR*n- Ampervariablen sind Zeichenkettenvariablen mit fester bzw. variabler Länge n.
Externe Ampervariablen dienen als Schnittstellen zu Routinen, die in C oder FORTRAN geschrieben wurden.

Alle Ampervariablen müssen vor ihrer ersten Verwendung deklariert werden.

Ampervariablen der Typen INTEGER, REAL, CHAR*n und VCHAR*n können

definiert werden. Die Dimension des Feldes wird als positive Integerkonstante angegeben.

Ampervariablen der Typen CHAR*n und VCHAR*n müssen so definiert werden, dass n eine positive Integerkonstante ist.

Beispiele für Variablendeklarationen
BeispielInterpretation
INTEGER &I,&J,&K(100) &I und &J werden als skalare Integer-Ampervariablen und &K als Integer­Ampervariablenfeld der Größe 100 definiert.
&I, &J sowie alle Elemente von &K werden vor der Modellausführung mit Null initialisiert.
REAL &X,&Y,&Z(100) &X und &Y werden als skalare Real-Ampervariablen und &Z als Real­Ampervariablenfeld der Größe 100 definiert.
&X, &Y sowie alle Elemente von &Z werden vor der Modellausführung mit Null initialisiert.
CHAR*5 &STRING,&X(10) &STRING wird als skalare Character-Ampervariable mit einer festen Länge von 5 Zeichen und &X als Character-Ampervariablenfeld der Größe 10 definiert, wobei jedes Feldelement eine feste Länge von 5 Zeichen hat.
&STRING sowie alle Elemente von &X werden vor der Modellausführung mit je 5 Leerzeichen initialisiert.
VCHAR*5 &STRING,&X(10) &STRING wird als skalare Character-Ampervariable mit einer maximalen Länge von 5 Zeichen und &X als Character-Ampervariablenfeld der Größe 10 definiert, wobei jedes Feldelement eine maximale Länge von 5 Zeichen hat. &STRING sowie alle Elemente von &X werden vor der Modellausführung mit Nullstrings initialisiert, d.h. ihre aktuelle Länge wird auf Null gesetzt.
EXTERNAL &WEIBULL,&IPOISSON &WEIBULL und &IPOISSON werden als externe Ampervariablen definiert. Bei einem Funktionsaufruf gibt &WEIBULL einen Real-Wert und &IPOISSON einen Integer-Wert zurück.

Felder von Ampervariablen

Ampervariablen, die als Feld (Array) deklariert wurden, werden durch Angabe eines in Klammern eingeschlossenen Indexwertes angesprochen.

&K(10) greift z. B. auf das 10. Element des Ampervariablenfeldes K zu. Indizierte Zugriffe können bis zu jeder gewünschten Tiefe verschachtelt werden, so ist z.B. &A(&B(&C+3)­5) zulässig, vorausgesetzt, dass &A und &B als Arrays deklariert wurden.

Der Index darf ein beliebiger Ausdruck mit einem numerischen Wert sein, dessen ganzzahliger Teil zwischen 1 und der bei der Deklaration vereinbarten Feldlänge oder -dimension liegt.

Programmbeispiel
Das folgende Beispiel zeigt ein GPSS/H-Programm, in dem ein Feld der Länge 5 deklariert wird.
SIMULATE bewirkt die Ausführung nach erfolgreicher Übersetzung.
LET bewirkt eine Wertzuweisung an die angegebene Variable.

Wenn man das Start-Button drückt, wird das Programm auf einem Server abgearbeitet und die Antwort erscheint auf einer neuen HTML-Seite.
Mit diesem Programm kann man experimentieren, indem man es ändert oder ergänzt.
Übrigens werden die Werte von Variablen nur dann in der Standardausgabe angezeigt, wenn bei der Programmabarbeitung ein Laufzeitfehler auftritt. Der wird hier durch den Indexwert 3/4 hervorgerufen. Die ganzzahlige Division 3/4 ergibt 0, einen unzulässigen Indexwert.

Integer-Ampervariablen

Integer-Ampervariablen müssen vor ihrer ersten Verwendung im Modell in einer INTEGER-Direktive als Skalare oder eindimensionale Arrays deklariert worden sein. Integer-Ampervariablen können auf vielfache Weise numerische Werte zugewiesen werden, z.B.

Werte können in Integer-Ampervariableneingelesen werden, indem man sie in die Eingabeliste von Laufzeit-Eingabeanweisungen setzt. Bei Zuweisung reeller Werte gehen die Stellen nach dem Dezimalpunkt verloren. Alle skalaren Integer-Ampervariablen und alle Elemente von Integer-Ampervariablenarrays werden vor der Modellausführung mit Null initialisiert.

Das folgende Beispiel illustriert die Verwendung von Integer-Ampervariablen:

Real-Ampervariablen


Real-Ampervariablen dienen der Speicherung von Gleitkommawerten. Sie müssenin einer REAL-Direktive als Skalare oder als eindimensionale Arrays vor ihrer ersten Verwendung in einem Modell deklariert worden sein. Real-Ampervariablen können auf vielfache Weise Werte zugewiesen werden, z.B. durch die LET-Anweisung oder den BLET-Block. Werte können in Real-Ampervariablen eingelesen werden, indem man sie in die Eingabeliste von Laufzeit-Eingabeanweisungen setzt. Alle skalaren Real-Ampervariablen und alle Elemente von Real-Ampervariablenarrays werden vor der Modellausführung mit Null initialisiert.
Das folgende Beispiel illustriert die Verwendung von Real-Ampervariablen:

Das obige Programm benutzt das Numerische Standardattribut SQRT, das als Wert die Quadratwurzel seines Arguments liefert. Standardattribute sind mit den Funktionen in anderen Programmiersprachen vergleichbar: sie liefern bei jedem Aufruf einen aktuellen Wert.

CHAR*n-Ampervariablen

CHAR*n-Ampervariablen werden zum Speichern und Manipulieren von Zeichenketten verwendet. Sie sind besonders für die symbolische Kommunikation mit den Modellnutzern nützlich. Sie können z.B. dazu verwendet werden, Botschaften an interaktive Modellnutzer zu senden oder Nutzerantworten zu speichern und zu analysieren. Die Länge n einer CHAR*n Ampervariablen ist konstant und muß in einer CHAR*n-Direktive vor der ersten Verwendung der Ampervariablen deklariert worden sein.

CHAR*8 &SAM z.B. deklariert SAM als Zeichenkettenvariable mit der festen Länge 8. Alle skalaren CHAR*n Ampervariablen und alle Elemente eines CHAR*n Ampervariablenarrays werden vor der Modellausführung mit Strings vonn Leerzeichen initialisiert.

Wenn einer CHAR*n-Ampervariablen ein Wert zugewiesen wird, sind drei Fälle möglich.

  1. Falls die Länge des zugewiesenen Strings gleich n ist, wird eine einfache Zuweisung vorgenommen.
  2. Falls die Länge kleiner als n ist, wird die Zeichenkettenvariable nach der Zuweisung mit Leerzeichen aufgefüllt (padded), bis sie die Länge n hat.
  3. Ist die Länge der Zeichenkette größerals n, werden die ersten n Zeichen in die CHAR*n-Variable kopiert.

Angenommen, &X ist eine CHAR*10 Variable, dann illustriert das folgende Beispiel die drei vorher erwähnten Fälle:

Anweisung Wert von &X
LET &X='WALLA WALLA' 'WALLA WALL'
LET &X='EXACT SIZE' 'EXACT SIZE'
LET &X='SHORTIE' 'SHORTIE^^^'(mit Leerzeichen aufgefüllt

Das obige Beispiel illustriert nur die Zuweisung von Zeichenkettenkonstanten an CHAR*n-Variablen. CHAR*n-Variablen können jedoch auch in Eingabeanweisungen verwendet werden, und der Verkettungsoperator sowie das Zeichenkettenstandardattribut SSG(substring) dienen zur Bildung von Zeichenkettenausdrücken.

VCHAR*n-Ampervariablen

VCHAR*n -Ampervariablen dienen zum Speichern und Manipulieren von Zeichenketten. Ihre Länge wird jedesmal bestimmt, wenn der Variablen ein Wert zugewiesen wird. Die maximale Länge n muß in einer VCHAR*n-Direktive vor der ersten Verwendung der Variablen deklariert worden sein.
VCHAR*10 &SAM legt z.B. fest, dass SAM eine Zeichenkettenvariable ist, deren Länge bis zu einem Maximum von 10 variiert.
Alle skalaren VCHAR*n-Ampervariablen und alle Elemente eines VCHAR*n-Ampervariablenarrays werden vor der Modellausführung mit Nullstrings initialisiert, d.h. ihre aktuelle Länge wird auf Null gesetzt.

Man beachte, dass sich ein Nullstring von einer Zeichenkette, die nur aus Leerzeichen besteht, unterscheidet. Die Länge eines Nullstrings beträgt Null, während eine Zeichenkette, die aus Leerzeichen besteht, eine Länge hat, die ungleich Null ist.

Wenn einer VCHAR*n Variablen ein Wert zugewiesen wird, sind zwei Fälle möglich:

  1. Falls die Länge des zuzuweisenden Strings kleiner oder gleich n ist, wird eine einfache Zuweisung vorgenommen und die aktuelle Länge der Variablen auf die Länge des Strings gesetzt.
  2. Ist die Länge des Strings größer als n, werden die ersten n Zeichen des Strings in die VCHAR*n Variable kopiert und die aktuelle Länge der Variablen auf n gesetzt, die maximale Länge.

Angenommen, &X ist eine VCHAR*10-Variable, dann illustriert das folgende Beispiel die beiden vorher erwähnten Fälle:

Anweisung Wert von &X
LET &X='WALLA WALLA' 'WALLA WALL' (abgeschnitten)
LET &X='SHORTIE' 'SHORTIE' (kein Auffüllen mit Leerzeichen)

Das obige Beispiel illustriert nur die Zuweisung von Zeichenkettenkonstanten an VCHAR*n Variable. VCHAR*n Variablen könnenjedoch auch in Eingabeanweisungen verwendet werden, und der Konkatenationsoperator sowiedas Zeichenketten-Standardattribut SSG(substring) dienen zur Bildung von Zeichenkettenausdrücken.

Externe Ampervariablen

Mit externen Ampervariablen hat man die Möglichkeit, ein GPSS/H-Modell mit Routinen, die in solchen Sprachen wie C und Fortran geschrieben wurden, zu verbinden. Externe Ampervariablen müssen in einer EXTERNAL-Direktive vor ihrer ersten Verwendung deklariert worden sein. Sie können Subroutinen (Aufruf durch die CALL-Anweisung oder denBCALL-Block) oder Funktionen (werden in-line verwendet und liefern einen Wert zurück) sein. Externe Ampervariablen, die Funktionen darstellen, können Integer- oder Realwerte zurückgeben, aber keine Zeichenketten.

Kontrollfragen über Typen, Konstanten und Ampervariablen

  1. Nennen Sie die im GPSS/H verfügbaren Typen von Werten!
  2. Wie lassen sich Integer-Typen weiter untergliedern?
  3. Wie kann man lange Zeichenkettenkonstanten auf mehrere Programmzeilen verteilen?
  4. Was versteht man unter Ampervariablen?
  5. Nach welchen Regeln ist der Name einer Ampervariablen zu bilden?
  6. Nennen Sie Typen von Ampervariablen!
  7. Welche Wertetypen dürfen REAL- und INTEGER Ampervariablen zugewiesen werden?
  8. Nennen Sie Beispiele für Anweisungen, die eine Wertzuweisung an INTEGER Ampervariablen bewirken!
  9. Welcher Unterschied besteht zwischen CHAR*n und VCHAR*n-Ampervariablen!
  10. Geben Sie je ein Beispiel für
    • die Definition einer skalaren Ampervariablen und
    • die Definition eines Feldes von Ampervariablen!
  11. Welchen Anfangswert haben Ampervariable nach ihrer Deklaration?

SAHome previous next up Englishsmaller fonts Top Line
Last Modified Fri 05-27-11 06:54 GMT Valid CSS!

Comments please to:pelosim@yahoo.com