Mit den Pseudobasen CURRENT und PARAMETER können Sie auf Betriebsdaten des Programms DAMP zugreifen.
Die Pseudobasis CURRENT
In Diagnose-Algorithmen werden nicht nur die Daten des Diagnoseobjekts, sondern mitunter auch „Betriebsdaten“ des Programms DAMP benötigt. Diese erreicht man über die Pseudobasis CURRENT.betriebsdatum. Die verfügbaren Informationen sind nachfolgend erklärt.
Bis auf CURRENT.ALET, CURRENT.ATYPE, CURRENT.ERROR, CURRENT.SPID und CURRENT.SEGMENT sind die Felder nicht überschreibbar. Zuweisen eines Wertes auf nur lesbare Felder führt zu einem Compilierungsfehler.
CURRENT.ALET
Beim Zugriff auf Datenräume (vgl. CURRENT.ATYPE) muss CURRENT.ALET mit dem gewünschten Wert für ALET (numerischer Wert der Länge 4) versorgt werden. Die zugehörige TID muss mit der Standardprozedur NEW_TASK (siehe "Standardprozeduren") eingestellt werden.
CURRENT.ATYPE
Standardmäßig werden in PRODAMP Adressen als virtuell interpretiert. Es gibt aber auch die Möglichkeit, den Realspeicher oder die Hardware System Area (HSA) sowie Datenräume zu adressieren. Hierzu dienen das Pseudo-Symbol CURRENT.ATYPE und die Pseudokonstanten VIRTUAL, REAL, HSA, ABS_ADDRESSING, ALET und SPID, die man an dieses Pseudosymbol zuweisen kann. Bei der Zuweisung wird definiert, welcher Speicher in den folgenden Statements adressiert werden soll.
Durch Zuweisung von ABS_ADDRESSING an das Pseudosysmbol CURRENT.ATYPE kann im VM2000-Gesamtsled, z.B. zur Auswertung des Hypervisors, absoluter Speicher adressiert werden.
Beispiel 1 zu CURRENT.ATYPE: Adressieren der HSA
HSA_START := CURRENT.HSA; TEST_VALUE := 0; ARRANGE .TEST_SYMBOL : TYPE=NUMERIC,LENGTH=1,RELATIVE=0; END ARRANGE ; CURRENT.ATYPE := HSA; TEST_VALUE := HSA_START.TEST_SYMBOL; IF CURRENT.ERROR <> 0 THEN MESSAGE ( 'Hardware System Area ist nicht adressierbar !!' ); ELSE .... END IF; CURRENT.ATYPE := VIRTUAL;
Einige Einschränkungen müssen beachtet werden: der eingestellte Speichertyp gilt nur beim Ansprechen von Speicherbereichen über Symbole und ist auch nur lokal in der aktuellen Prozedur wirksam. Sollen aufgerufene Prozeduren auch auf Realspeicher, HSA, absoluten Speicher oder Datenräume zugreifen, muss lokal in diesen Prozeduren der Speichertyp umgeschaltet werden. Ausnahme zu dieser Regel ist die vordefinierte Prozedur DUMP_MEMORY (siehe "Standardprozeduren"), welche es erlaubt, auch Real-, HSA-Speicher, absoluten Speicher oder Bereiche aus Datenräumen direkt auf Liste auszugeben.
Bei den Angaben ALET und SPID müssen vor dem Zugriff über CURRENT noch die gewünschten Werte für ALET bzw. SPID gesetzt werden, wie in dem folgenden Beispiel gezeigt wird:
Beispiel 2 zu CURRENT.ATYPE:
ARRANGE .TEST.SYMBOL : TYPE = NUMERIC, LENGTH = 4, OFFSET = 0; END ARRANGE; CURRENT.ATYPE := ALET; CURRENT.ALET := X'01010003'; PTR := 0; OUT := PTR.TEST_SYMBOL; IF CURRENT.ERROR <> 0 THEN MESSAGE ( 'Zugriff-Fehler, ALET = ' + HEX_STRING(CURRENT.ALET,8) + ', TID = ' + HEX_STRING(CURRENT.TID,8) ); ELSE ... END IF; CURRENT.ATYPE := VIRTUAL;
Bei der Angabe von ALET wird zum Zugriff immer die aktuell eingestellte TID verwendet, die gegebenenfalls mit der Standardprozedur NEW_TASK (siehe "Standardprozeduren") neu gesetzt werden kann.
Weiter werden Symbole, die automatisch lokalisiert werden, immer virtuell adressiert. Will man den Realspeicher, den absoluten Speicher oder die HSA adressieren, muss also immer eine Basis-Adresse angegeben werden (wie im obigen Beispiel).
Es ist aber mehr erlaubt als nur die einfache Zuweisung. Das Pseudo-Symbol CURRENT.ATYPE hat intern den Typ numerisch. Man muss also nicht explizit VIRTUAL, REAL, HSA, ABS-ADDRESSING, ALET oder SPID angeben. Man kann zum Beispiel auch mit dem Wert Berechnungen ausführen (wenig sinnvoll), den aktuellen Wert in andere Variablen übernehmen oder zum Beispiel einen Speichertyp als Parameter für eine Prozedur mitgeben. Wird ein ungültiger Wert an CURRENT.ATYPE zugewiesen, wird dies nur zur Laufzeit bemerkt, und die Prozedur abgebrochen. Zur Zeit der Compilierung werden die Werte nicht auf Gültigkeit geprüft.
Beispiel 3 zu CURRENT.ATYPE
CURRENT.ATYPE:=35
Die Zuweisung ist syntaktisch korrekt.
Beispiel 4 zu CURRENT.ATYPE: Parameter-Übergabe
Es wird eine Prozedur aufgerufen, die den Inhalt der Realadresse 0 als abdruckbaren String zurückliefert.
AUFRUFER: VALUE := ' '; PRINTABLE_VALUE ( 0, REAL, VALUE ); PROZEDUR PRINTABLE=VALUE : LOC := 0; ARRANGE .ADDR : TYPE=NUMERIC, LENGTH=4, RELATIV=0; 'PARAMETER 1' .SPEICHER : TYPE=NUMERIC, LENGTH=4, RELATIV=4; 'PARAMETER 2' .ZIEL : TYPE=STRING, LENGTH=8, RELATIV=8; 'PARAMETER 3' .INHALT : TYPE=NUMERIC, LENGTH=4, RELATIV=0; END ARRANGE CURRENT.ATYPE := PARAMETER.SPEICHER; LOC := PARAMETER.ADDR; PARAMETER.ZIEL := HEX_STRING ( LOC.INHALT, 8 ); RETURN;
CURRENT.CPU
CURRENT.CPU enthält den Namen der CPU aus dem Diagnoseobjekt als String der Länge 8. Für eine als PAM-Datei geöffnete Datei wird die CPU des aktiven Systems ausgegeben.
CURRENT.CONFIGURATION
CURRENT.CONFIGURATION enthält die Bezeichnung der Hardware-Konfiguration aus dem Diagnoseobjekt als String der Länge 21 (z.B. 7.500- S210-60). Die Ausgabe entspricht der Bezeichnung beim Kommando /SHOW-SYSTEM-INFORMATION. Für eine als PAM-Datei geöffnete Datei wird die Konfiguration des aktiven Systems ausgegeben.
CURRENT.CSMA
CURRENT.CSMA enthält die (absolute) Anfangsadresse des Common-Shadow-Memory (CSMA), also einen numerischen Wert der Länge 4.
CURRENT.DTYPE
CURRENT.DTYPE enthält einen numerischen Wert der Länge 1 Byte (8 Bit), der das geöffnete Medium beschreibt. Dieser Wert hat folgendes Format:
Medium | f | Dump | |||||
Es bedeutet:
Medium = 0 (B'0000') :
Medium nicht definiert
Medium = 1 (B'0001') :
System
Medium = 2 (B'0010') :
Objekt kann ausgewählt werden
Medium = 3 (B'0011') :
Dump
Medium = 4 (B'0100') :
PAM-Datei
Medium = 5 (B'0101') :
Selbstlader
Der Fall Medium = 2 kann nur im Dialog auftreten, wenn die Dumpdatei mehrere Objekte enthält und im INF-Schirm noch keine abschließende Auswahl getroffen wurde (z.B. VM2000-Gesamtsled, SLED vom SLED). Es sollte daher für diesen Fall ein Programmabbruch vorgesehen und im INF-Schirm eine Auswahl getroffen werden. Wurde im INF-Schirm keine Auswahl getroffen, ist ein Zugriff auf das Objekt (nur VM2000-Gesamtsled) mit PRODAMP nur im absoluten Adressierungsmodus möglich (CURRENT.ATYPE = ABS_ADDRESSING).
Im Fall Medium = 3 (0011) sind auch f und Dump besetzt. Es bedeutet:
Dump = 0 (B'000') : | Sled |
Ist f mit 1 besetzt (nur im Falle von Sled und Userdump), dann handelt es sich bei Sled um eine Snap-Datei und bei Userdump um einen Area-Dump.
Beispiel zu CURRENT.DTYPE:
Will man prüfen, ob es sich bei dem geöffneten Medium um einen Userdump handelt, ist beispielsweise folgende Abfrage möglich:
IF CURRENT.DTYPE / 16 = 3 AND CURRENT.DTYPE MOD 8 = 2 THEN
CURRENT.DUMPTIME
CURRENT.DUMPTIME enthält Datum und Uhrzeit der Dumpdatei im Format String der Länge 19: jjjj-mm-tt hh:mm:ss. Bei der Diagnose des aktiven Systems wird das aktuelle Datum mit Uhrzeit geliefert.
CURRENT.ERROR
Entdeckt PRODAMP eine Inkonsistenz, die sich intern abfangen lässt, die also nicht den Abbruch der PRODAMP-Prozedur erfordert, wird CURRENT.ERROR auf einen Wert ungleich 0 gesetzt. Fehlt beispielsweise eine gewünschte Seite im Dumpfile, rechtfertigt das noch keinen Abbruch der Prozedur. Wird hingegen ein angegebenes Symbol nicht in der zugeordneten Symboldatei gefunden, bricht PRODAMP ab, da es sich dabei meist um einen Tippfehler handeln dürfte, der im Source der PRODAMP-Prozedur zu korrigieren ist.
Jeder Zugriff auf ein Datum des Diagnoseobjekts kann im Prinzip zu einem Fehler führen, der über CURRENT.ERROR abgefragt werden sollte, da andernfalls der weitere Ablauf der PRODAMP-Prozedur nicht vorhersehbar ist. Nur wenn nacheinander auf mehrere Objekte innerhalb der gleichen Datenstruktur zugegriffen wird und man sicher ist, dass die Datenstruktur die Speicherseite nicht überschreitet, können Sie sich aus Gründen der Performance und der Übersichtlichkeit darauf beschränken, CURRENT.ERROR nach dem ersten Zugriff abzufragen.
Der Fehlercode, der u.U. in CURRENT.ERROR hinterlegt wird, ist für die Diagnose unerheblich. Sie sollten CURRENT.ERROR daher nur gegen 0 vergleichen.
Durch Zuweisen des Wertes 0 (CURRENT.ERROR := 0) kann CURRENT.ERROR explizit zurückgesetzt werden. Dies ist jedoch in vielen Fällen unnötig, da PRODAMP den CURRENT.ERROR in folgenden Situationen automatisch zurücksetzt:
Beim Eintritt in eine Prozedur (CURRENT.ERROR wird prozedurlokal geführt).
Bei einem erfolgreichen lesenden Zugriff mit einem Symbol auf Daten des Diagnoseobjekts oder auf Betriebsdaten von DAMP (siehe Abschnitt „Symbole").
Beispiel
X:=.ETCBTID, Z:= CURRENT.DTYPE, Y:=PARAMETER .P1
Ausnahme: Der lesende Zugriff auf CURRENT.ERROR.
Bei erfolgreicher Nutzung einer der Standardfunktionen von DAMP.
Ausnahme: Der Aufruf von PATTERN verändert CURRENT.ERROR nicht.Bei erfolgreicher Ausführung der Standardprozeduren NEW_TASK oder READ.
Bei erfolgreicher Ausführung wird der CURRENT.ERROR von allen anderen Standardprozeduren und Zuweisungen innerhalb PRODAMP nicht zurückgesetzt.
Beispiel zu CURRENT.ERROR
TEST := P2_FCB.ID2CFLID ; "PSEUDO-HARDVALIDATION" IF CURRENT.ERROR = 0 THEN "GEFAHRLOSER ZUGRIFF MOEGLICH" IF P2_FCB.ID2IND1 = ID2PRIVC THEN IF P2_FCB.ID2LOCK = ID2OUTL THEN "DO SOMETHING" END IF ; END IF ; END IF ;
CURRENT.FILENAME
CURRENT.FILENAME enthält den Namen des gerade geöffneten Diagnoseobjekts als String der Länge 54. Falls das aktive System untersucht wird, enthält der String nur Leerzeichen.
CURRENT.HSA
CURRENT.HSA enthält bei SLED-Dateien die (absolute) Anfangsadresse der Hardware-System-Area, also einen numerischen Wert der Länge 4. Da nur SLED-Dateien eine Hardware-System-Area besitzen, ist bei anderen Dumpdateien der Inhalt von
CURRENT.HSA=0.
CURRENT.ITN
siehe CURRENT.TID.
CURRENT.LEVEL
Das Pseudosymbol CURRENT.LEVEL enthält einen numerischen Wert der Länge 1, der die Schachtelungstiefe bei Unterprogrammaufrufen angibt. Diejenige Prozedur, bei der ein RETURN in die DAMP-Umgebung zurückführt, hat CURRENT.LEVEL 0, eine von dieser Prozedur aufgerufene Unterprozedur hat LEVEL 1 usw.
CURRENT.PCB
Das Pseudosymbol CURRENT.PCB enthält die Adresse des im Diagnosefenster 3 eingestellten aktuellen PCB, also einen numerischen Wert der Länge 4. Ist dort kein PCB eingestellt, enthält das Feld den Wert -1 (X'FFFFFFFF').
CURRENT.PTYPE
CURRENT.PTYPE enthält einen numerischen Wert der Länge 1 Byte, der den Ablaufmodus von DAMP anzeigt.
Folgende Werte sind möglich:
CURRENT.PTYPE = 0 (B'00000000') : DAMP läuft im Dialogmodus ab
CURRENT.PTYPE = 1 (B'00000001') : DAMP läuft im Prozedurmodus ab
CURRENT.PTYPE = 2 (B'00000010') : DAMP läuft im Batchmodus ab
CURRENT.SEGMENT
CURRENT.SEGMENT wird benötigt, wenn mit sehr großen Adressen (Adressbreite größer als 32 Bit) auf das Diagnoseobjekt zugegriffen werden soll; zwei Situationen sind zu unterscheiden:
Zugriff mit großen realen oder absoluten Adressen.
In CURRENT.SEGMENT ist das 4 GB Segment zu übergeben, welches bei jedem folgenden Lesen mit CURRENT.ATYPE=REAL oder =ABS_ADDRESSING, d.h. bei realer oder absoluter Adressinterpretation, automatisch berücksichtigt wird.
PAM-Zugriff auf eine große Datei.
Ist das geöffnete Diagnoseobjekt eine PAM-Datei, müssen zur Lokalisierung von Daten absolute Adressen angegeben werden, die sich aus der PAM-Seitennummer P und der relativen Distanz D aus folgender Formel ergeben:
A = (P - 1)*2048 + D
<=
D<=
2047Bei großen PAM-Dateien (es sind maximal 534 773 760 Seiten möglich) kann A mehr als 4 Bytes benötigen. Eine PAM-Datei wird daher in insgesamt 256 Segmente mit jeweils 2 097 152 Seiten eingeteilt.
Zum Auffinden von Daten müssen in einer PRODAMP-Prozedur immer das 4-GB-Segment (in CURRENT.SEGMENT) und die relative Adresse innerhalb des Segments angegeben werden.
Zur Berechnung des Segments für eine gegebene PAM-Seite sollte die vorzeichenlose Arithmetik (UNSIGNED_ON) wie im unten angegebenen Beispiel verwendet werden.
CURRENT.SEGMENT wird prozedurlokal geführt und beim Start auf 0 gesetzt.
In den meisten Fällen (Adressen < 4 GB) ist eine explizite Zuweisung daher nicht notwendig. Eine Versorgung mit einem negativen oder einem Wert größer als 255 führt stets zu einem Laufzeitfehler.
Beispiel 1 zu CURRENT.SEGMENT: Umrechnung PAM-Seitennummer zu Segment und Adresse
UNSIGNED_ON; " Die PAM-Seite PAM_PAGE ist umzurechnen in 4 GB-Segment-Nummer - mit der CURRENT.SEGMENT unmittelbar versorgt wird - und eine 32-Bit breite Adresse 'BYTE_ADDRESS'" IF PAM_PAGE > X'1FE00000' THEN " Jede BS2000 Datei hat hoechstens X'1FE00000' Seiten " MESSAGE ('** FEHLER: PAMSEITE ZU GROSS **'); RETURN WINDOW=CURRENT.WNDNO; END IF; CURRENT.SEGMENT := (PAM_PAGE-1)/X'200000'; "dividiert durch 2 hoch (32-11)" BYTE_ADDRESS := (PAM_PAGE-1)*X'800'; "mult. mit 2 hoch 11"
Beispiel 2 zu CURRENT.SEGMENT: Absolutes Lesen von Adresse X'1 8000 0000'
CURRENT.A_TYPE := ABS_ADDRESSING; CURRENT.SEGMENT := 1; A:=X'80000000'; "Adresse im 4 GB-Segment" ARRANGE .FULLWORD: LENGTH=4,TYPE=NUMERIC,OFFSET=0; Wert := A.FULLWORD; "Zugriff auf ein Wort an Adresse X'180000000'" IF CURRENT.ERROR = 0 THEN "u.s.w"
CURRENT.SPID
CURRENT.SPID muss beim Zugriff auf Datenräume (vgl. CURRENT.ATYPE) mit dem gewünschten Wert für SPID (String der Länge 8) versorgt werden.
CURRENT.TIME
CURRENT.TIME enthält die seit LOGON vergangene CPU-Zeit in Millisekunden, als numerischen Wert der Länge 4. Wird der Maximalwert (ca. 25 Tage) überschritten, dann wird der Maximalwert zurückgeliefert und gleichzeitig CURRENT.ERROR ungleich 0 gesetzt.
CURRENT.TID, CURRENT.TSN und CURRENT.ITN
Die Pseudosymbole CURRENT.TID und CURRENT.TSN erlauben den Zugriff auf die aktuelle Task. CURRENT.ITN bedeutet das rechte Halbwort des TID, das die Task zum Diagnose-Zeitpunkt eindeutig bestimmt.
Bei System-, User und Areadumps ist die aktuelle Task stets die Dump-Task und kann nicht geändert werden. Bei SLED-, SNAP-Dumps oder im aktiven System wird die aktuelle Task durch Auswahl einer Task im Status-Fenster (W2), durch Eingabe einer TID (bzw. ITN) oder TSN in der Kopfzeile eines Fensters oder von PRODAMP aus durch Aufruf der Prozedur NEW_TASK festgelegt. Die jeweils eingestellte aktuelle Task ist über CUR-RENT.TID, CURRENT.ITN bzw. CURRENT.TSN ansprechbar. Alle Zugriffe zu taskspezifischen Tabellen (TCB, JCB etc.) sowie zu Adressen im Benutzeradressraum beziehen sich immer auf die eingestellte aktuelle Task.
CURRENT.TID und CURRENT.ITN sind numerische Typen, CURRENT.TSN ist ein Stringtyp der Länge 4.
CURRENT.TSN
siehe CURRENT.TID.
CURRENT.VERSION
Das Pseudosymbol CURRENT.VERSION enthält die aktuelle BS2000-Version des Diagnoseobjekts als String der Länge 4 in der Form XX.X, also z.B. 21.0. Hierbei handelt es sich um die Version des aktuellen Systems, falls eine Datei als normale PAM-Datei geöffnet ist.
CURRENT.WNDNO
Das Pseudosymbol CURRENT.WNDNO enthält die Nummer des „aktuellen“ Diagnosefensters, d.h. desjenigen Fensters, das bei der folgenden Bildschirmausgabe als oberstes am Bildschirm erscheinen würde. Da durch ARRANGE die Reihenfolge der Fenster verändert wird, kann man CURRENT.WNDNO zum Beispiel dazu benutzen, bei Fehlern in der Fensterzuweisung wieder das PRODAMP-Fenster als aktuelles Fenster einzustellen.
Die Pseudobasis PARAMETER
PRODAMP-Prozeduren können beim Aufruf aus der DAMP-Programmebene, wie auch beim Aufruf als Unterprozedur aus einer PRODAMP-Prozedur, Parameter übergeben werden (siehe auch Abschnitt „Mit Prozeduren arbeiten (Spezialfenster PROC)").Beim Aufruf wird aus den Parametern ein Parameterbereich gebildet, der die Werte der Parameter aneinander gereiht enthält. In den Parameterbereich werden numerische Datenwerte und Bitmuster stets rechtsbündig in ein 4 Byte langes Feld eingetragen.
Der statisch erste Aufruf aus einer PRODAMP-Prozedur heraus dient dem Compiler zur Definition des Parameterbereiches. Der Aufruf setzt sich aus dem Namen der gerufenen Prozedur und einer geklammerten Liste der aktuellen Parameter zusammen.
Von PRODAMP werden auch Unterprozeduren ohne Parameter unterstützt. Rekursiver Aufruf ist erlaubt.
Um auf die Parameter zugreifen zu können, müssen mit der PRODAMP-Anweisung ARRANGE Symbole vereinbart werden. Über die Pseudobasis PARAMETER können die Symbole angesprochen werden.
Beispiel 1 zur Pseudobasis PARAMETER
Die Prozedur GETOPC soll den an der Adresse MOD + ADD gefundenen Opcode im Symbol OPC zurückliefern.
Prozedur GETOPC:
ARRANGE .MOD : TYPE = STRING, RELATIVE = 0, LENGTH = 8; .ADD : TYPE = NUMERIC,RELATIVE = 8, LENGTH = 4; .OPC : TYPE = NUMERIC,RELATIVE =12, LENGTH = 4; END ARRANGE ; ARRANGE .BYTE : TYPE=NUMERIC,RELATIVE=0,LENGTH=1; END ARRANGE ; A := ADDRESS ( PARAMETER.MOD,'CP' ) + PARAMETER.ADD ; PARAMETER.OPC := A.BYTE ;
MOD := 'DOPEN' ; ADD := X'4ADC' ; GETOPC ( MOD, ADD, OPC ) ; IF OPC = X'47' THEN .....
Den Strukturvariablen PARAMETER.XX darf ein Wert zugewiesen werden. Dieser Wert wird den Parameter-Variablen zugewiesen, die von der rufenden Prozedur an gleicher Stelle verwendet werden.
Zum Übersetzungszeitpunkt sind Typen und Längen der Parametersymbole und aller anderen Strukturvariablen noch nicht bekannt (siehe Abschnitt „Mit Prozeduren arbeiten (Spezialfenster PROC)").
Beispiel 2 zur Pseudobasis PARAMETER
Trotz anderer Angabe werden die Daten mit den Standardwerten „numerisch“ und „Länge 4“ übertragen:
ARRANGE .DST:TYPE=STRING,RELATIVE=0,LENGTH=8; .SRC:TYPE=STRING,RELATIVE=8,LENGTH=8; END ARRANGE PARAMETER.DST:=PARAMETER.SRC;
Die richtige Zuweisung erreicht man hier nur durch das Einführen einer Hilfsvariablen:
STR:=' ' * 8; STR:=PARAMETER.SRC; PARAMETER.DST:=STR;
Die Parameter werden bei einem Aufruf aus der DAMP-Programmebene über die Anweisungen RESUME-PRODAMP-PROGRAM oder START-PRODAMP-PROGRAM übergeben. Es können jedoch in diesem Fall keine Ergebnisse in die aufrufende Ebene ausgegeben werden. Das ist nur möglich, wenn eine Prozedur eine Unterprozedur aufruft. Es lassen sich aber durchaus Prozeduren schreiben, die sowohl beim Aufruf aus der Programmebene als auch als Unterprogramm sinnvoll arbeiten, wenn man via CURRENT.LEVEL abfragt, auf welcher Ebene man sich befindet.
Es werden also alle Parameter nach der Methode „call by reference“ übergeben, d.h., es wird die Adresse des Parameters an die Prozedur übergeben. Literale und Ausdrücke können aber auch direkt als Parameter übergeben werden. Die entsprechenden Strukturvariablen können in der gerufenen Prozedur auch beschrieben werden, transportieren aber keine Werte zurück.
Mit ARRANGE können verschiedene Parameterlisten definiert werden, die dann jeweils nach einem INTERRUPT der Pseudobasis PARAMETER überlagert werden können. Es müssen zwar bei einem RESUME-PRODAMP-PROGRAM alle Parameter angegeben werden, die nach dem zugehörigen INTERRUPT ausgewertet werden, es lässt sich jedoch ein „geführter Dialog“ programmieren.
Beispiel 3 zur Pseudobasis PARAMETER
ARRANGE .TSN : TYPE=STRING,LENGTH=4, RELATIVE=0; END ARRANGE; MESSAGE ( 'Bitte TSN eingeben. (RESUME fenster,''tsn'')' ) ; INTERRUPT; TASK := PARAMETER.TSN ; ARRANGE .NUM : TYPE=NUMERIC,LENGTH=4,RELATIVE=0; END ARRANGE; MESSAGE ( 'Bitte Anzahl Durchläufe angeben. (RESUME fenster,num)'); INTERRUPT; DURCHL := PARAMETER.NUM ;
Beim symbolischen Zugriff mit der Pseudobasis PARAMETER wird lediglich überprüft, ob sich das zuzugreifende Datum innerhalb des vom Aufrufer mitgegebenen Parameterbereichs befindet; wenn dies nicht der Fall ist, erfolgt ein Programmabbruch mit entsprechender Laufzeitfehlermeldung (siehe Beispiele 4 und 5).
Andere Fehler - die Typen der Aufrufparameter passen nicht zu den in der gerufenen Prozedur mit ARRANGE definierten Feldern - können von DAMP nicht erkannt werden, und führen somit zur Laufzeit zu unvorhersehbaren Effekten.
Mit der Standardfunktion LENGTH kann die Gesamtlänge des Parameterbereichs in der gerufenen Prozedur abgefragt werden, z. B. um in der gerufenen Prozedur auf fehlende Parameter zu reagieren.
Beispiel 4 zur Pseudobasis PARAMETER: Überprüfung der Länge des Parameterbereichs
Das folgende PRODAMP-Programm soll mit zwei Parametern, einer Adresse und einem optional anzugebenden Counter aufgerufen werden. Ist der 2. Parameter nicht versorgt, soll stattdessen mit einer Voreinstellung gerechnet werden.
"Layout des Parameterblocks (2. Parameter darf fehlen )" ARRANGE .ADDR_OF_STRUCT : OFFSET=0,LENGTH=4,TYPE=NUMERIC; "1.Parameter" .COUNTER : OFFSET=4,LENGTH=4,TYPE=NUMERIC; "2.Parameter" END ARRANGE; " Uebernahme der Parameter in die Variablen ADDR_OF_STRUCT und COUNTER. " " Ist Counter nicht angegeben, wird COUNTER=100 gesetzt." L:=LENGTH('*PARAMETER','DS'); IF CURRENT.ERROR <> 0 THEN MESSAGE (' Programm abgebrochen. DAMP ab Version V4.2 erforderlich '); RETURN WINDOW=CURRENT.WNDNO; ELSIF L=4 THEN ADDR_OF_STRUCT:= PARAMETER.ADDR_OF_STRUCT; COUNTER := 100; ELSIF L=8 THEN ADDR_OF_STRUCT:=PARAMETER.ADDR_OF_STRUCT; COUNTER:=PARAMETER.COUNTER; ELSE MESSAGE ('Programm abgebrochen. Falsche Parameterversorgung'); END IF; " u.s.w. ( ADDR_OF_STRUCT und COUNTER sind nun versorgt )"
Beispiel 5 zur Pseudobasis PARAMETER: Künstlicher Parameterbereich
In manchen Fällen ist es nützlich, dass für ein PRODAMP-Programm ein Arbeitsbereich in dem Parameterbereich vorgesehen wird, auf den dann „frei“ zugegriffen werden kann. Dies lässt sich sehr einfach dadurch realisieren, dass sich das Programm ein zweites Mal, nun mit erweitertem Parameterbereich aufruft:
|