Peter Lorenz English smaller fonts Simulation und Animation

3.3. Anweisungen

GPSS/H unterscheidet nicht zwischen Programmen und Modellen. Beide Begriffe werden synonym gebraucht. Ein Programm ist eine Folge von Anweisungen.
Anweisungen (Befehle, Kommandos, Statements) sind die kleinsten selbständigen Komponenten von Programmiersprachen, mit denen Aktionen ausgelöst werden. Diese Aktionen können während der Compilierzeit, während des Laufs oder während der sogenannten Blockausführung stattfinden. Das ist die Grundlage für die später einzuführende Klassifikation.
In den vorigen Abschnitten sind schon einige Anweisungen eingeführt oder in Beispielen benutzt worden. Dazu gehören INTEGER, REAL, VCHAR*n, CHAR*n, SIMULATE, END, LET und DO-ENDDO.

3.3.1. Anweisungsformate Top Line

Gelegentlich unterscheidet man formatfreie Sprachen wie Pascal oder C von formatgebundenen Sprachen wie FORTRAN. GPSS/H gehört zur Klasse der formatgebundenen Sprachen.

Jede GPSS/H-Anweisung beginnt auf einer neuen Zeile und die einzelnen Teile einer Anweisung stehen in vorgeschriebenen Spaltenbereichen. Dazu gelten folgende Regeln:

3.3.2. Anweisungsklassen Top Line

Die praktisch wichtigste Klassifikation von Anweisungen ergibt sich aus ihrer Ausführungszeit.

Nach der Ausführungszeit unterscheidet man im GPSS/H folgende Anweisungsklassen:
Beispiele für Anweisungen
Compilerdirektive Steueranweisung Block
INTEGERLETGENERATE
VCHAR*80STARTADVANCE
OPERCOLFUNCTIONTERMINATE

3.3.3. Marken Top Line

Marken kennzeichnen Sprungziele. Sie müssen als gültige Bezeichner oder, in einigen Fällen, als Integer-Konstanten definiert sein. Numerische Marken für Blöcke sind nicht erlaubt. In den meisten Sprachen ist es nicht erlaubt, Marken doppelt zu verwenden. Anders in GPSS/H: Das erneute Auftreten einer Marke wird als Redefinition der markierten Anweisung verstanden. Das ist besonders beim Experimentieren mit Modellen nützlich. Nach erneuter Benutzung einer Marke gibt der Compiler eine Warnung aus: Die Zweitnutzung könnte ja unabsichtlich sein. Die Ausführung wird aber nicht unterbrochen.

3.3.4. Operanden Top Line

Die Operanden einer Anweisung werden als eine Liste geschrieben, in der das Komma als Trennzeichen dient. Fast immer sind Ausdrücke als Operanden zulässig. Das gilt insbesondere für alle Operanden von Blöcken.

Operanden dürfen, wenn sie zu lang sind und nicht auf eine Zeile passen, auf beliebig vielen Zeilen fortgesetzt werden. Dazu muß als letztes Zeichen auf der fortzusetzenden Zeile _ (underline) geschrieben werden. Dieses Zeichen wird bei der Compilierung durch das erste Zeichen der Folgezeile ersetzt. Durch diese Regel wird die Benutzbarkeit des Zeichens _ eingeschränkt oder fast ausgeschlossen.

Ränge oder Folgen

Einige Anweisungen erlauben die Spezifikation einer Folge von Objekten und benutzen das Zeichen "-" im Sinne von bis. So macht der Block SUNAVAIL 2-7 die Speicher (Storages) der Nummern 2 bis 7 unverfügbar. Wenn man hier den unteren oder oberen Index als Ausdruck codiert, können Klammern erforderlich werden

.

Leerzeichen vermeiden!

Anfänger machen immer wieder den Fehler, Leerzeichen in die Liste der Operanden einzufügen. Das ist unzulässig! GPSS/H betrachtet das erste auftretende Leerzeichen als Trennzeichen zwischen Operanden und nachfolgendem Kommentar!

3.3.5. Kommentare Top Line

Die Benutzung von Kommentaren ist nachdrücklich zu empfehlen: Sie verbessert die Lesbarkeit der Programme.

Im GPSS/H sind Kommentare alle Texte, die

Nur in der Anweisung MACRO sind zwei Leerzeichen zur Abtrennung erforderlich. (Operanden einer MACRO-Anweisung dürfen ein Leerzeichen enthalten.)

3.3.6. Ausgewählte Compilerdirektiven Top Line

LIST |UNLIST |EQU | OPERCOL |REALLOCATE

Compilerdirektiven sind Anweisungen, welche die Übersetzung des GPSS/H Quelltextes beeinflussen, aber auf den Programmlauf keinen direkten Einfluß haben.

Anweisungen zur Definition von Ampervariablen

Die INTEGER-, REAL-, CHAR*n- und VCHAR*n- Anweisungen sind im Abschnitt 3.1.3. vorgestellt worden. Sie werden bei der Compilierung verarbeitet.

LIST- und UNLIST-Anweisung

LIST und UNLIST beeinflussen die Ausgabe des Compilerprotokolls. Sie können ohne Operanden auftreten oder einen der drei folgenden Operanden haben:


EQU-Anweisung

EQU
ist eine Compilerdirektive, welche die automatische Zuordnung von Namen zu Nummer von Modellelementen aufhebt und die vom Nutzer gewählte Zuordnung festlegt. Ihre Syntaxdarstellung lautet
symbol EQU wert[(range)],type[,type]...
Dabei wird dem angegebenen Symbol ein ganzzahliger positiver Wert zugewiesen. Das kann auch für eine ganze Serie von Werten geschehen. Diese Zuordnung gilt für die durch type angegebene(n) Klasse(n) von Modellelementen.
Die Modellelementklassen werden entsprechend der nebenstehenden Tabelle codiert.
Einem Symbol darf nur ein Wert zugewiesen werden. Um Fehlern vorzubeugen, sollten Blocknamen oder Symbole nicht als Namen oder Symbole für andere Modellelemente benutzt werden.
E-CodeModellelementklasseR-Code
BBoolesche Variable BVR
CBenutzerkette
User Chain
CHA
FEinrichtung
Facility
FAC
GGruppeGRP
LLogischer SchalterLOG
MXVollwortmatrix FMS
MBBytematrixBMS
MHHalbwortmatrix HMS
MLGleitpunktmatrix LMS
PBByteparameter-
PFVollwortparameter-
PHHalbwortparameter-
PLGleitpunktparameter -
QWarteschlange
queue
QUE
RNZufallszahlengenerator
Random Number Generator
RNO
SSpeicher
Storage
STO
TTabelleTAB
VVariableVAR
XFVollwortskalarFSV
XBByteskalarBSV
XHHalbwortskalarHSV
XLGleitpunktskalar LSV
ZFunktionFUN
E-Code: Code für die EQU-Anweisung
R-Code: Code für die REALLOCATE-Anweisung

Es ist grundsätzlich erlaubt und durchaus üblich, dass Elemente verschiedener Klassen denselben Namen haben.

Wenn man zur Abbildung einer Kasse eine Warteschlange, einen Speicher, ein Skalar und eine Einrichtung benötigt, schreibt man also z. B.
KASSE EQU 1,Q,S,XH,F Damit wird die Nummer 1 dem Namen KASSE zugeordnet. Vier verschiedenartige Modellelemente haben nun diesen Namen und diese Nummer.

Bei der Konstruktion großer Modelle sollte man die absolute Zuordnung von Nummern und Namen vermeiden. Die später zu behandelnden Funktionen vom Typ S erlauben eine Zuordnung relativer Nummern zu Namen von Modellelementen. Das ist vorteilhaft, wenn man große Modelle aus vorgefertigten Teilmodellen zusammensetzen will.


STARTMACRO- und ENDMACRO- Anweisungen

STARTMACRO und ENDMACRO sind Compilerdirektiven, mit denen eine Makrodefinition eröffnet bzw. abgeschlossen wird. Die Behandlung von Makros erfolgt im Kapitel 5.

OPERCOL-Anweisung

OPERCOL
ist eine Compilerdirektive, mit der die höchste Spaltennummer festgelegt wird, bei der der Operandenteil der Anweisungen beginnen darf. Oberhalb dieser Spaltennummer erwartet der Compiler nur Kommentar. Der voreingestellte Default-Wert ist 25.

REALLOCATE-Anweisung

REALLOCATE
ist eine Compilerdirektive, mit welcher die Maximalzahlen für Instanzen von Modellelementklassen neu festgelegt werden. Ihre Syntaxdarstellung lautet
REALLOCATE code,anzahl[,...]

Die zur Kennzeichnung von Modellelementklassen benutzten Codes unterscheiden sich von den in der EQU-Anweisung benutzten Codes. Sie sind in der Spalte R-Code in der zur EQU-Anweisung gelieferten Tabelle enthalten.

So bedeutet:
REALLOCATE FAC,100
dass im Modell maximal100 Einrichtungen (Facilities) benötigt werden und dafür Speicherplatz reserviert wird.
Wenn als code COM angegeben wird, so wird damit ein sogenannter Common-Speicherbereich dimensioniert. In diesem Bereich werden Attribute von Transaktionen und Werte von Matrizen gespeichert. Wenn dieser Bereich zu gering dimensioniert ist, erhält man eine darauf hinweisende Fehlernachricht.

3.3.7. Ausgewählte Steueranweisungen Top Line

LET-Anweisung

LET
ist eine Steueranweisung, welche einer Ampervariablen den Wert eines Ausdruckes zuweist. Ihre Syntaxdarstellung lautet
[label] LET &var=ausdruck
Bei der Wertzuweisung muß auf Typkompatibilität geachtet werden. Numerischen Variablen dürfen nur numerische und Zeichenkettenvariablen nur Zeichenkettenausdrücke zugewiesen werden. Wenn man einer ganzzahligen Variablen einen reellen Wert zuweist, wird der gebrochene Teil abgeschnitten.

Die LET-Anweisung ist in mehreren obenstehenden Beispielen benutzt worden.

IF-ELSE-ELSEIF-ENDIF-Anweisungen

Diese Anweisungen bewirken die bedingungsabhängige Ausführung von Steueranweisungen. Ihre Anwendung erfolgt entsprechend dem Syntaxschema
[label] IF bedingung1 folge von anweisungen ELSEIF bedingung2 folge von anweisungen ELSEfolge von anweisungen ENDIF

Nur IF und ENDIF sind notwendig. ELSEIF und ELSE sind optional. ELSEIF darf mehrfach auftreten.

DO-ENDDO-Anweisungen

DO und ENDDO
werden zur Konstruktion von Schleifen benutzt. Ihre Syntaxdarstellung lautet
[label] DO &index=startwert,endwert, [inkrementwert incremantal value]
anweisung(en) statement(s)
[label] ENDDO Folgende Regeln sind zu beachten:
  1. &index muß eine INTEGER-Ampervariable sein.
  2. Wenn kein inkrementwert angegeben ist, wird der Default-Wert 1 benutzt, um den Wert von &index zu modifizieren.
  3. Die Bearbeitung der Schleife wird abgebrochen, wenn der Wert von &index den endwert überschreitet.
startwert, endwert und inkrementwert sind beliebige numerische Ausdrücke. Wenn sie Gleitpunktwerte besitzen, werden die Stellen nach dem Dezimalpunkt abgeschnitten.

DO-Schleifen können bis zur Tiefe 19 ineinander verschachtelt werden.


GOTO-Anweisung

GOTO ist eine klassische, unbedingte Sprunganweisung. Sie gilt nur für Steueranweisungen, also nicht für Blöcke. Ihre Syntaxdarstellung lautet:
[label] GOTO ziellabel
ziellabel ist das Label oder die Marke der Anweisung, die als nächste auszuführen ist.
CLOSE GOTO HERE
DO ENDDO LET
IF ENDIF GETLIST
PUTPIC GETSTRING PUTSTRING

Bei weitem nicht alle Anweisungen dürfen markiert werden!
Die nebenstehende Liste informiert über Anweisungen, die mit einer Marke versehen werden und damit als Sprungziel dienen können.

HERE-Anweisung

HERE ist eine Steueranweisung, deren Ausführung nichts bewirkt. Sie wird als Sprungziel benutzt. Man benötigt sie wegen der vielen Einschränkungen bezüglich der Zulässigkeit von Marken.

END-Anweisung

END ist eine Steueranweisung, mit welcher der Quelltext eines Programms abgeschlossen wird. END bewirkt die Rückgabe des Speicherplatzes an das Betriebssystem und das Schließen aller offenen Files.

Es gibt viele weitere Steueranweisungen. Die meisten von ihnen werden in den nächsten Abschnitten dieses Kapitels vorgestellt.

Kontrollfragen über Anweisungen

  1. Aus welchen Komponenten besteht eine GPSS/H-Anweisung?
  2. Wie kann man GPSS/H-Anweisungen klassifizieren?
  3. Wozu führt im GPSS/H die doppelte Benutzung einer Marke?
  4. Welche Folgen hat die irrtümliche Benutzung von Leerzeichen zwischen Operanden?
  5. Welche Funktion hat die EQU-Compilerdirektive?
  6. Wozu benötigt man die REALLOCATE-Anweisung?
  7. Wie wirkt LET, wenn einer INTEGER-Variablen der Wert eines reellwertigen Ausdrucks zugewiesen wird?
  8. Geben Sie drei Beispiele für verschiedene Formen der Nutzung der IF-Anweisung!
  9. Schreiben Sie ein Programmbeispiel, das eine Zufallszahlentafel mit 10 Zeilen und 8 Spalten druckt!
  10. Wozu benötigt man die HERE-Anweisung?

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