next up previous
Nächste Seite: Bedingte Compilation Aufwärts: Systemspezifische Besonderheiten Vorherige Seite: Initialisierte Variablen

Tagitems

Die Version 2.0 des Betriebssystems macht intensiven Gebrauch von sogenannten ,,TagItems``.

Deren Deklaration gestaltet sich etwa folgendermassen:

TYPE
  TagItem = RECORD
    tag:LONGCARD; (* Kennung, was data bedeuten soll *)
    data:ADDRESS  (* beliebiges Langwort *)
  END;
  TagItemPtr = POINTER TO ARRAY [0.. ??] OF TagItem;

Die Prozeduren erwarten also als Parameter einen Zeiger auf ein offenes Feld aus Langworten.

In Intuition gibt es z.B. neu die Prozedur:

PROCEDURE OpenWindowTagList(
                nw{R.A0}:NewWindowPtr;
                tags{R.A1}: TagItemPtr;
                ):WindowPtr;

Mit Hilfe der Tags können mehr Parameter angegeben werden, als es in der NewWindow-Struktur möglich wäre. Hier kann sogar der Zeiger auf NewWindow NIL sein, womit dann alle Einstellungen über die Tags vorgenommen werden. Jede Eigenschaft -- Breite, Höhe, Flags, und so fort -- des neuen Fensters wir durch ein TagItem festgelegt. Nicht angegebene Eigenschaften bekommen einen Vorgabewert zugewiesen.

In gestaltet sich ein derartiger Aufruf im Gegensatz zur Sprache C sehr aufwendig, was an einem Beispiel demonstriert werden soll:


\begin{example}
\begin{alltt}
\relax{} VAR
\\ buffer: ARRAY [0..8] OF TagItem;
\...
....
\\ win:=OpenWindowTagList(NIL,ADR(buffer));
\\ \relax \end{alltt}\end{example}

Um diesen Aufwand zu reduzieren, wurde eine neue Standard Prozedur implementiert:

SYSTEM.TAG(VAR x:AnyType;
val {,val}:ADDRESS):ADDRESS;

Der erste Parameter ist eine Variable beliebigen Typs, die als Speicherbereich zur Aufnahme der nachfolgenden Langworte dient. Sie muss gross genug sein, um alle Langworte aufnehmen zu können. Sie darf kein offener Feldparameter sein. Falls eine der Bedingungen nicht zutrifft, erfolgt eine Fehlermeldung.

Die nachfolgenden Parameter dürfen beliebigen skalaren Typs oder Mengen sein. Sie werden implizit in den Typ ADDRESS konvertiert, also je nach Typ vorzeichenlos oder vorzeichenbehaftet auf Langworte erweitert; Mengen sind in diesem Sinne vorzeichenlos. Der Typ BOOLEAN wird wie üblich gehandhabt, d.h. FALSE ergibt ADDRESS(0), TRUE ergibt ADDRESS(1), wie es das Betriebssystem auch erwartet. Im allgemeinen wird sowieso nur auf 0 getestet.

Der genaue Algorithmus ist:

  (*$ RangeChk:=FALSE OverflowChk:=FALSE *)
  IF valtyp=set THEN valtyp:=SHORTCARD|CARDINAL|LONGCARD END;
  buffer[i]:=ADDRESS(val);
  (*$ POP RangeChk POP OverflowChk *)

Der Rückgabewert der Prozedur TAG ist die Adresse der übergebenen Variablen.

Der Aufruf nach obigem Beispiel sieht hiermit nun so aus:

VAR
  bufferForAllTags: ARRAY [0..50] OF LONGINT;
...
  win:=OpenWindowTagList(NIL,SYSTEM.TAG(bufferForAllTags,
        waLeft,              20,
        ...,                 ...,
        waPubScreenFallBack, TRUE,
        waTitle,             ADR("MyWindow"),
        waIDCMP,             IDCMPFlagSet{...},
        tagEnd)); (* niemals vergessen! *)

Obwohl diese Prozedur nur für die TagItems entwickelt wurde, kann sie natürlich auch anderweitig verwendet werden, z.B. um Arrays zu initialisieren oder auch für die Prozedur Terminal.Format. Hierbei muss aber bedacht werden, dass sie nur Langworte verarbeitet! Bei der Format-Prozedur muss also immer (bis auf %s) das ,,l`` mit angegeben werden!


\begin{example}
Beispiel:
\begin{verbatim}Format(''Name: %s, Geschlecht: %lc,...
...''Name: Klaus Klaps, Geschlecht: m, Alter: 021\n''\end{verbatim}\end{example}


next up previous
Nächste Seite: Bedingte Compilation Aufwärts: Systemspezifische Besonderheiten Vorherige Seite: Initialisierte Variablen
Claudio Nieder 2000-11-12