Peter Lorenz English smaller fonts Simulation und Animation

3.4. Ein- und Ausgaben

Viele Simulationssysteme sind als autonome Systeme gestaltet, die keinen Datenaustausch mit ihrer Umwelt vorsehen oder diesen Datenaustausch nur auf schwierigen Wegen ermöglichen. Das gilt auch für ältere GPSS-Versionen. In den ersten GPSS-Versionen war Dateneingabe nicht vorgesehen: Alle benutzten Daten mußten in das Programm hineingeschrieben werden.
Zur Resultatdarstellung mußte man sich ursprünglich mit einer Standardausgabe begnügen, die später durch eine noch heute verfügbare benutzereigene Ausgabe ergänzt oder ersetzt werden konnte. Diese mit der Anweisung REPORT eingeleitete benutzereigene Ausgabe wird heute nicht mehr benötigt, weil es effizientere Formen der individuellen Gestaltung von Resultatausgaben gibt. Gelegentlich benutzt man sie noch zur schnellen Erzeugung alphamosaikgraphischer Darstellungen. Demgegenüber arbeitet man nach wie vor oft mit der Standardausgabe. Diese wird zuerst im Abschnitt 4.1. vorgestellt.
Das heutige GPSS/H ist offen und kooperativ: Datenein- und -ausgabe sind einfach und effizient. GPSS/H-Programme können mit einer unbeschränkten Anzahl von Dateien arbeiten. Für Eingabedaten gilt ein einfaches Format: Das Leerzeichen dient als Trennzeichen zwischen Zahlen oder Zeichenketten, die einzulesen sind. Die Datenausgabe wird durch besonders einfache Formatangaben gesteuert, die man auch als Pictures bezeichnet. Eingabe/Ausgabe-Anweisungen (E/A-Anweisungen) sind als Steueranweisungen und als Blöcke verfügbar. Sie haben End-of-file- und Error-Ausgänge, die als Sprungziele interpretiert werden.
Die einfache, leicht erlernbare Datenein- und -ausgabe ist Gegenstand dieses Abschnittes.

3.4.1. E/A-Anweisungen Top Line

Im folgenden werden alle E/A-Anweisungen von GPSS/H vorgestellt. Diese Anweisungen sind sowohl als Steueranweisungen als auch in Form von Blöcken verfügbar. Im Rahmen dieses Kapitels werden nur die Steueranweisungen benötigt.

GETLIST
ist eine Steueranweisung zur Eingabe von Werten von einem Eingabegerät oder einer Datei. Begonnen wird immer mit einem neuen Datensatz. Ein vorhergehender Datensatz, dessen Werte von einer vorangegangenen GETLIST-Anweisung nicht vollständig gelesen wurden, ist nicht mehr zugänglich. Die Syntaxdarstellung lautet:

[label] GETLIST [END=endlabel,][ERR=errlabel,] [FILE=filename,]i/o-list
endlabel
bezeichnet ein Sprungziel beim Erreichen des Dateiendes.
errlabel
bezeichnet ein Sprungziel für den Fall eines unzulässigen Eingabewertes. Ein Eingabewert ist unzulässig, wenn er ein ungültiges Zahlenformat besitzt oder wenn sein Typ mit dem Typ der entsprechenden Variablen in der E/A-Liste (i/o-list) unverträglich ist.
filename
ist der logische Name einer Datei, der in einer FILEDEF-Anweisung definiert wurde. Wenn filename nicht spezifiziert ist, wird der Name GUSER angenommen, der das aktuelle E/A-Gerät, in der Regel eine Tastatur, bezeichnet. Dieser interaktive Modus ist im Web gegenwärtig nicht implementierbar und steht nur bei lokaler Installation von GPSS/H zur Verfügung.
i/o-list
bezeichnet eine in Klammern eingeschlossene Liste von Variablen (E/A-Liste), in welche die Eingabewerte eingetragen werden sollen.
BGETLIST
ist ein Block, dessen Funktion und dessen Operanden mit denen von GETLIST übereinstimmen.
GETSTRING
ist eine Steueranweisung zur Eingabe eines kompletten Datensatzes in eine Zeichenkettenvariable. Man benutzt GETSTRING anstelle von GETLIST, wenn
  • GETLIST den Nutzerwünschen nicht entspricht und wenn der Inhalt eines Datensatzes mit nutzereigenen Methoden ausgewertet werden soll oder
  • wenn die volle Funktionalität von GETLIST nicht benötigt wird.
Die Syntaxdarstellung lautet
[label] GETSTRING [END=endlabel,][FILE=filename,] i/o-list
endlabel
bezeichnet ein Sprungziel beim Erreichen des Dateiendes.
errlabel
ist hier nicht vorgesehen: Jeder beliebige Inhalt eines Datensatzes wird als ASCII-Zeichenfolge interpretiert und in der Stringvariablen in i/o list gespeichert.
filename
ist der logische Name einer Datei, der in einer FILEDEF-Anweisung definiert wurde. (Siehe auch Erläuterungen zu GETLIST).
i/o-list
bezeichnet eine VCHAR*n oder eine CHAR*n-Ampervariable, die den Datensatz als Zeichenkette aufnehmen soll.
BGETSTRING
ist ein Block, dessen Funktion und dessen Operanden mit denen von GETSTRING übereinstimmen.
PUTPIC
ist eine Anweisung zur Ausgabe von Daten entsprechend einem Muster oder Picture, das
  • auf einer oder mehreren Folgezeilen dieser Anweisung oder
  • in einer gesonderten PICTURE-Anweisung aufgezeichnet ist.
Die Syntaxdarstellung lautet:
[label] PUTPIC [FILE=filename,][LINES=nlines,] [PICTURE=piclabel,]i/o-list
filename
ist der logische Name einer Datei, der in einer FILEDEF-Anweisung definiert wurde. Wenn filename nicht spezifiziert ist, wird der Name SERCOM angenommen, der das aktuelle E/A-Gerät, in der Regel ein Bildschirm, bezeichnet. Dieser interaktive Modus ist im Web gegenwärtig nicht implementierbar und steht nur bei lokaler Installation von GPSS/H zur Verfügung.
nlines
gibt die Anzahl der Folgezeilen an, auf denen das Ausgabemuster oder Picture dargestellt ist. Defaultwert bei fehlender Angabe ist 1.Wenn nlines größer ist, als die tatsächliche Anzahl von Folgezeilen, werden darauffolgende Anweisungen als Folgezeilen interpretiert. Wenn nlines kleiner ist, als die tatsächliche Anzahl von Folgezeilen, werden die überzähligen Folgezeilen als GPSS/H-Anweisungen interpretiert. Das führt meist zur Anzeige von Syntaxfehlern.
piclabel
bezeichnet den Namen oder die Marke einer PICTURE-Anweisung, die zur Gestaltung der Ausgabe zu verwenden ist. Die Nutzung einer PICTURE-Anweisung ist alternativ zur Picture-Spezifikation auf Folgezeilen. Innerhalb einer PUTPIC-Anweisung darf nur eine dieser beiden Möglichkeiten benutzt werden.
i/o-list
bezeichnet eine in Klammern eingeschlossene Liste von Variablen (E/A-Liste), in welche die Eingabewerte eingetragen werden sollen.
BPUTPIC
ist ein Block, dessen Funktion und dessen Operanden mit denen von PUTPIC übereinstimmen.
PUTSTRING
ist eine Anweisung, welche einen String oder den Wert eines Stringausdruckes als Datensatz ausgibt. Im Rahmen dieses Stringausdruckes sind Konkatenation mittels || und die Stringfunktion SSG erlaubt. Die Syntaxdarstellung lautet
[label] PUTSTRING [FILE=filename,]i/o-list
filename
ist der logische Name einer Datei, der in einer FILEDEF-Anweisung definiert wurde. Wenn filename nicht spezifiziert ist, erfolgt die Ausgabe bei lokalem Betrieb auf dem Bildschirm. Im interaktiven Mode geht die Ausgabe verloren.
i/o-list
bezeichnet einen Zeichenkettenausdruck, dessen Wert in einen Ausgabesatz hineingeschrieben werden soll.
BPUTSTRING
ist ein Block, dessen Funktion und dessen Operanden mit denen von PUTSTRING übereinstimmen.
PICTURE
ist eine Anweisung zur Spezifikation eines Ausgabemusters, das von einer [B]PUTPIC-Anweisung oder von mehreren derartigen Anweisungen benutzt werden kann. Die Syntaxdarstellung lautet
label PICTURE [LINES=nlines]
nlines
gibt die Anzahl der Folgezeilen an, auf denen das Ausgabemuster zu spezifizieren ist.
.

Die Spezifikation des Ausgabemusters oder Pictures erfolgt wie gesagt in Picture-Zeilen, d.h. Folgezeilen der Anweisungen.

Wert Editierfeld Ausgabe
Übereinstimmende Längen
123***123
-12***-12
3.1416*.****3.1416
'Hello'*****Hello
Editierfeld zu lang
123*****^^123
-12*****^^-12
3.1416*.******3.1416^^
'Hello'*******Hello^^
'Hello'******.*Hello^
Editierfeld zu kurz
123*123
-12**-12
-12.345*.*-12.3
'Hello'**Hello
^ steht hier für ein Leerzeichen.
Eine Picture-Zeile beschreibt den Aufbau eines Satzes der Ausgabedatei. Sie besteht aus Texten und Editierfeldern.
Texte
ge(werden unverändert in den Ausgabesatz übernommen.
Editierfelder
erkennt man am Auftreten von * (Asterisk). Man benötigt für jede auszugebende Größe der E/A-Liste ein Editierfeld. Dabei entspricht jedem * eines Editierfeldes grundsätzlich ein Zeichen der auszugebenden Größe. Diese exakte Übereinstimmung wird in den ersten vier Zeilen nebenstehender Tabelle dargestellt. Er bildet in der Praxis die Ausnahme: In der Regel ist die darzustellende Größe länger oder kürzer als das Editierfeld.

Editierfeld zu lang: In diesem Fall, wo die auszugebende Größe weniger Zeichen benötigt als im Editierfeld vorgesehen sind, geschieht folgendes:

  1. Integer-Werte werden rechtsbündig in das Editierfeld oder links vom Dezimalpunkt des Editierfeldes eingetragen.
  2. Real-Werte werden so eingetragen, dass die Stellung des Dezimalpunktes erhalten bleibt. Dezimalkomma ist nicht vorgesehen.
  3. Zeichenkettenwerte werden linksbündig eingetragen. Nicht benutzte Sterne bleiben als Leerzeichen erhalten. Beim Eintrag in Editierfelder mit Dezimalpunkt gehen die Stelle für den Dezimalpunkt und die links stehenden Sterne verloren.

Editierfeld zu kurz: Wenn ein auszugebender Wert mit der im Editierfeld vorgegebenen Zeichenlänge nicht auskommt, geschieht folgendes:

  1. Für Integer- oder Zeichenkettenwerte wird der Ausgabeplatz so erweitert, dass sich alles nach rechts verschiebt.
  2. Für Real-Werte werden alle Stellen vor dem Dezimalpunkt angezeigt und der Platz dafür entsprechend ausgeweitet. Rechts vom Dezimalpunkt wird die angegebene Anzahl von Stellen ausgegeben.

3.4.2. Verbindung von Filenamen mit logischen NamenTop Line

Wenn eine Eingabeanweisung kein FILE= -Schlüsselwort nutzt, d.h. kein Eingabefile spezifiziert, wird der logische Filename GUSER angenommen.

Wenn ein Ausgabeanweisung kein FILE= -Schlüsselwort nutzt, d.h. kein Eingabefile spezifiziert, wird der logische Filename SERCOM angenommen.
Das gilt für die lokale Nutzung von GPSS/H. Im Web sind beide logische Files momentan nicht verfügbar. Hier ist man auf eine Lösung angewiesen, die im lokalen Betrieb auch funktioniert: Man nutzt die Steueranweisung FILEDEF, um eine Zuordnung von logischen und physischen Filenamen herzustellen und gibt in allen E/A-Anweisungen den Namen eines vorher definierten Files an.

FILEDEF
ist eine Anweisung zur Verbindung externer Filenamen mit den internen, logischen Filenamen, die in E/A-Anweisungen benutzt werden können. Der erste E/A-Zugriff öffnet das File zum Lesen oder Schreiben. Die Syntaxdarstellung lautet
[fname] FILEDEF fnamestring,[APPEND]
fname
ist der logische Name einer Datei. Zulässig sind symbolische Namen, die bekanntlich mit Buchstaben beginnen und maximal 8 alphanumerische Zeichen enthalten, wobei Konflikte mit vordefinierten Namen zu vermeiden sind.
fnamestring
ist ein Zeichenkettenausdruck, im einfachsten Fall eine Zeichenkettenkonstante, die den physischen Dateinamen angibt. Die Wahl des Namens muß die im benutzten Betriebssystem geltenden Regeln für Filenamen beachten.
APPEND
ist für Ausgabefiles zulässig und bewirkt, dass Ausgabesätze an das Ende eines existierenden Files angehängt werden. Wenn APPEND nicht angegeben ist, wird ein existierendes File überschrieben, so dass der bisherige Inhalt verlorengeht.
Weiterhin ist zu beachten, dass eine FILEDEF-Anweisung für ein gerade offenes File zu einem Laufzeitfehler führt.
Wenn man einen logischen Filenamen in einer E/A-Anweisung benutzt, ohne vorher mit FILEDEF den Bezug zu einem physischen Filenamen herzustellen, wird der logische Filename auch als physischer Filename benutzt.
BFILEDEF
ist ein Block, dessen Funktion mit der von FILEDEF übereinstimmt. Die Syntaxdarstellung lautet
[label] BFILEDEF fname,fnamestring,[APPEND]
CLOSE
ist eine Steueranweisung, mit der ein File geschlossen wird. Nach dem Schließen kann ein File, das bisher zum Schreiben benutzt worden war, neu definiert und nun zum Lesen benutzt werden. Die Syntaxdarstellung lautet
[label] CLOSE fname,...
label
markiert die CLOSE-Anweisung als mögliches Sprungziel.
fname
ist der logische Name des zu schließenden Files.
BCLOSE
ist ein Block, dessen Funktion und dessen Operanden mit denen von CLOSE übereinstimmen.

Bereits im vorigen Beispiel ist die FILEDEF-Anweisung benutzt worden. Im folgenden Beispiel wird ein Animationstracefile definiert und es werden Anweisungen geschrieben, mit denen Objekte der Klasse Circle auf eine Fläche mit 4*3 Feldern verteilt werden.


3.4.3. E/A-Listen Top Line

E/A-Listen treten als Operanden der E/A-Anweisungen GETSTRING, GETLIST, PUTSTRING und PUTPIC auf. Die folgende Tabelle geht auf Besonderheiten von E/A-Listen dieser vier Anweisungen ein.

Anweisung E/A-Liste
GESTRING Zeichenketten-Ampervariable
GETLIST Liste von Ampervariablen oder anderer speicherfähiger Größen (z.B. Skalare)
PUTSTRING Zeichenkettenausdruck
PUTPIC Liste von Ausdrücken

Für E/A-Listen gelten die folgenden Regeln:

  1. E/A-Listen sind in Klammern einzuschließen.
  2. Wenn eine E/A-Liste mehrere Elemente enthält, sind diese durch Kommas zu trennen.
  3. Elemente einer E/A-Liste können einfache Elemente oder iterierte Teillisten sein.

Eine iterierte Teilliste repräsentiert eine Folge von Ausdrücken, die mehrfach für aufeinanderfolgende Werte einer Indexvariablen berechnet werden.

UnzulässigZulässig
(&X+&Y)&X+&Y
(&X+&Y)/&Z+(&X+&Y)/&Z
('Uni'||' Magdeburg')'Uni'||' Magdeburg'
Ein einfaches Element
einer E/A-Liste einer Ausgabeanweisung kann ein beliebig komplexer Ausdruck sein. Es darf nicht mit einer öffnenden Klammer ( beginnen, weil dadurch Verwechslungen mit den später zu erklärenden Präfixen möglich wären. Dort, wo Klammern in einem Ausdruck nötig sind, kann man sich durch Voranstellen von + oder durch das Zeichenkettenstandardattribut SSG helfen.
Eine iterierte Teilliste
muß in Klammern eingeschlossen sein. Sie besteht aus zwei Teilen: dem zu iterierenden Teil und dem Iterationssteuerteil.
Der zu iterierende Teil
besteht aus einem Einzelelement oder einer Liste, die wiederum iterierte Teillisten enthalten darf. Die Schachtelungstiefe ist unbegrenzt.
Der Iterationssteuerteil
hat das folgende Format:

&indexvariable=anfangswert,endwert[,inkrementwert]
&indexvariable
muß eine ganzzahlige Ampervariable sein.
anfangswert, endwert
sind beliebige numerische Ausdrücke, die notfalls durch Abschneiden ganzzahlig gemacht werden.
inkrementwert
ist ein numerischer Ausdruck, bei dessen Fehlen der Defaultwert 1 angenommen wird.
Die iterierte Teilliste wird wie folgt verarbeitet:
  • &indexvariable wird auf den Anfangswert gesetzt.
  • Für jeden Iterationsschritt einschließlich des ersten wird der Wert von &indexvariable mit dem Wert von endwert verglichen. Bei Überschreibung wird die Verarbeitung der Teilliste abgebrochen. Sonst werden deren Komponenten für die Ein- oder Ausgabe benutzt.
  • Nach Verarbeitung aller Komponenten des zu iterierenden Teils wird der Wert von &indexvariable und der Wert von inkrementwert erhöht.
Negative Inkrementwerte werden nicht unterstützt

Kontrollfragen über Ein- und AusgabenReturn

  1. Wie kann man in Dateien lesen?
  2. Welche Operanden hat die Anweisung GETLIST?
  3. Vergleichen Sie die Anweisungen GETLIST und GETSTRING!
  4. Welcher Unterschied besteht zwischen GETLIST und BGETLIST?
  5. Welche Anweisungen zum Schreiben in Dateien sind verfügbar?
  6. Welche Operanden hat die Anweisung PUTPIC?
  7. Wie unterscheiden sich PUTPIC- und PUTSTRING-Anweisung?
  8. Wie wirken PUTPIC- und PICTURE-Anweisungen zusammen?
  9. Wozu dient die PICTURE-Anweisung?
  10. Wie öffnet und wie schließt man Dateien?
  11. Darf man PUTPIC FILE=AAA,... schreiben, ohne vorher die Datei mit FILEDEF zu definieren?
  12. Was ist eine E/A-Liste?
  13. Was versteht man unter einer iterierten Teilliste einer E/A-Liste? Geben Sie ein Beispiel an!
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