next up previous
Nächste Seite: Verwendeter Ein- und Ausgabekanal Aufwärts: Bibliotheksmoduln Vorherige Seite: String

Terminal

Das Bibliotheksmodul Terminal bietet einige grundlegende Prozeduren, um Zeichen und Zeichenketten von der Tastatur zu lesen und auf dem Bildschirm auszugeben.

Das Modul Terminal berücksichtigt die Unterschiede, die sich aus der Arbeitsumgebung ergeben. Wird das Programm, das das Modul Terminal importiert, vom CLI aufgerufen, läuft die Ein- und Ausgabe über das entsprechende CLI-Fenster oder eine vom Benutzer angegebene Umleitung (Dos.Input, Dos.Output). Wird dasselbe Programm von der Workbench aus gestartet, wird zur Ein- und Ausgabe ein Fenster geöffnet.

Terminal verwendet die Methode der gepufferten Ausgabe. Das bedeutet, die Zeichen werden nicht sofort ausgegeben, sondern zunächst in einem internen Puffer zwischengespeichert. Diese Methode erhöht die Geschwindigkeit beträchtlich, da weit weniger Dos-Aufrufe nötig sind. Der Inhalt des Puffers wird ausgegeben, wenn:


\begin{warning}
Durch die Pufferung ergibt sich ein Problem: Sollen Zeichen auf ...
...Flush \end{quote}erfolgen, damit der Pufferinhalt ausgegeben wird.
\end{warning}

Die Variable waitCloseGadget kann vom Programmierer beliebig verändert werden. Ist sie bei Programmende TRUE (Standardeinstellung), und wurde das Programm von der Workbench gestartet, so erscheint im Fenster die Meldung

<< RETURN >>
Das Programm wartet so lange, bis der Bediener die -Taste betätigt hat und schliesst erst dann das Fenster. Ist die Variable FALSE, wird das Fenster sofort geschlossen. Beim Start vom CLI hat waitCloseGadget keine Bedeutung.

Die Prozedur Read liest ein Zeichen ein. Am Ende der Eingabedatei wird das Zeichen ASCII.eof zurückgegeben. Dies ist nötig, um das Eingabeende bei Eingabeumleitung zu erkennen. Man beachte, dass von einem Konsolenfenster die Eingabe erst empfangen werden kann, wenn die Zeile mit abgeschlossen wurde!

In einem Konsolenfenster kann ASCII.eof durch [$\backslash$] an das Programm übergeben werden. Dies ist sinnvoll, um das Verhalten bei Dateiende zu testen oder zu simulieren.

Die Prozedur BusyRead ist aus Gründen der Kompatibilität zur ursprünglichen Definition von Terminal übernommen worden. Der Grundgedanke von BusyRead ist die Abfrage, ob im Eingabestrom Zeichen zur Übernahme bereitstehen. In der üblichen Umgebung eines Konsolenfensters ist dies aber nicht möglich. Diese Implementation liest das nächste Zeichen von der Eingabe und weist es der Variablen ch zu. Ist kein Zeichen im Eingabestrom vorhanden, erhält ch den Wert ASCII.nul. Somit ist es nicht möglich, das Dateiende einer interaktiven Datei (Eingabe von [$\backslash$]) zu erkennen. Falls die Eingabe mittels Eingabeumlenkung von einer nicht-interaktiven Datei kommt, ist BusyRead identisch mit Read.

Die Prozedur ReadLn liest eine ganze Zeile vom Eingabestrom, d.h. bis das Zeichen ASCII.eol oder ASCII.eof erreicht wird. Die eingelesenen Zeichen werden in str abgelegt. Ist in der Variablen nicht genügend Platz vorhanden, wird der überschüssige Teil ignoriert und ist für das Programm verloren. Die Zeichenkette wird immer mit ASCII.nul abgeschlossen. Dürfen keine Zeichen verloren gehen, muss die Prozedur Read verwendet werden. Dem Parameter len wird die Länge der Zeichenkette zugewiesen.

Write gibt ein einzelnes Zeichen aus.

WriteLn gibt das Zeichen ASCII.eol aus. Dadurch wird der Cursor auf die erste Spalte der folgenden Zeile gesetzt.

Die Prozedur WriteString gibt die übergebene Zeichenkette aus. Die Zeichenkette muss nicht durch das Zeichen ASCII.nul abgeschlossen sein.

Die Prozedur Format benutzt die Funktion RawDoFmt der exec.library. Dabei wird ein Formatstring übergeben, der festlegt, wie die einzelnen Daten formatiert ausgegeben werden sollen, sowie die Adresse der Daten. Die Daten müssen von gleicher Anzahl und in der gleichen Reihenfolge im Speicher liegen wie die Formatangaben. Auch die Anzahl der jeweils belegten Bytes muss übereinstimmen. Diese speziellen Formatangaben beginnen immer mit einem ,,%``-Zeichen, worauf einige optionale Angaben folgen, und enden mit einem speziellen Zeichen, das die Art der Interpretation der Daten bestimmt.

Die Daten legt man sinnvollerweise in einem Record ab7.6, bei einzelnen Objekten kann auch einfach deren Adresse angegeben werden.

Man sollte sich aber davor hüten, um beispielsweise eine einzelne Zeichenkette mit ,,%s`` anzugeben, einfach ADR(str) zu schreiben. Richtig wäre ADR(ADR(str)). Da dies aber nicht möglich ist, sollte man hierzu die Prozedur FormatS benutzen!

Syntax der Formatangaben:

"%" ["-"] ["0"] [ min ["." max] ] ["l"] "d"|"x"|"c"|"s"

\begin{ttscript}{x}
\item[d] stellt den Wert als Dezimalzahl dar.
\item[x] stell...
... Angabe ,,l\lq\lq  keine Rolle.
\item[\%\%] ergibt das Prozentzeichen.
\end{ttscript}


\begin{example}
\noindent
Ein Beispiel:
\begin{verbatim}Rec.longint:=10;
Rec...
..., y,LMN123Ende''
mit anschliessendem Zeilenvorschub.\end{verbatim}\end{example}

FormatNr erlaubt die Ausgabe von berechneten Zahlen über die Format-Prozedur. Dadurch muss der Wert des Ausdrucks nicht in einer Variablen gespeichert werden.

Die Formatangabe für FormatNr muss immer ein ,,l`` enthalten, da der Parameter der Prozedur vom Typ LONGINT ist; andernfalls erhält man falsche Ausgaben!

  FormatNr("Das waren %ld Punkte!",v1*4+v2);
  --> "Das waren 234 Punkte!"

Die Prozedur FormatS erleichtert die Ausgabe von variablen Zeichenketten innerhalb einer Meldung.

  FormatS("Heute ist %s, der",DayArr[today]);
  --> "Heute ist Dienstag, der"
  FormatS(" - %s\n",fileName);
  --> " - Terminal.mod"
      mit anschliessendem Zeilenvorschub.

WriteInt und WriteHex geben eine Zahl x in einem Feld der Mindest-Breite ABS(n) aus. Ist der Wert von n negativ, wird die Zahl linksbündig formatiert, andernfalls rechtsbündig. WriteHex gibt die Zahl hexadezimal mit führenden Nullen aus, WriteInt dezimal mit führenden (oder angehängten) Leerzeichen.

  WriteInt(10,4)
  --> "  10"
  WriteInt(10,-4)
  --> "10  "
  WriteHex(10,4)
  --> "000A"
  WriteHex(10,-4)
  --> "A   "
  WriteInt(10,0)
  --> "10"



Unterabschnitte
next up previous
Nächste Seite: Verwendeter Ein- und Ausgabekanal Aufwärts: Bibliotheksmoduln Vorherige Seite: String
Claudio Nieder 2000-11-12