Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Standardfunktionen

&pagelevel(5)&pagelevel

Die in PRODAMP enthaltenen Standardfunktionen sind nur innerhalb von Prozeduren aufrufbar. Die Syntax der Funktionsaufrufe entspricht der Pascal-Syntax.

Funktionsname

Funktion

ADDRESS

DEC_BINARY

DEC_STRING

HEX_BINARY

HEX_STRING

LENGTH

LOCATION

PATTERN

PCK_BINARY

liefert die Adresse eines Moduls oder eines Kontrollblocks

umwandeln eines Dezimalstrings in eine numerische Variable

dezimale Druckaufbereitung

umwandeln eines Sedezimalstrings in eine numerische Variable

sedezimale Druckaufbereitung

Länge eines Moduls, Kontrollblocks oder Parameterbereichs ausgeben

liefert den Modulnamen zu einer Adresse

wandelt einen numerischen Wert in einen Wert vom Typ PATTERN um

entpacken gepackter Zahlen aus dem Diagnoseobjekt

Tabelle 14: Übersicht über PRODAMP-Standardfunktionen

Die aufgeführten Namen sollten nicht für eigene Prozeduren verwendet werden, da dies zu Fehlinterpretationen des Programms führen kann. 

ADDRESS
Liefert die Adresse eines Moduls oder eines Kontrollblocks

Die Standardfunktion ADDRESS liefert die Adresse eines Moduls. Die Ergebnis-Variable muss daher numerisch sein. Falls die Ergebnis-Variable noch nicht initialisiert ist, bekommt sie den Typ „numerisch“ und die Länge 4. ADDRESS kann auch dazu benutzt werden, um Relativadressen von Feldern in einem Kontrollblock zu ermitteln.

Module eines Benutzerprogramms sind im Allgemeinen nur in Userdumps zu finden.

Funktionsaufruf

Operation

Operanden

ADDRESS

(modname, susyname)

Operandenbeschreibung

modname

gibt den Namen des gesuchten Moduls an. 'modname' darf höchstens 32 Zeichen enthalten, Leerzeichen vor oder nach dem Modulnamen sind aber erlaubt.

In Stringtypen wird Groß- und Kleinschreibung unterschieden. modname muss also in Großbuchstaben angegeben werden.

susynamegibt das Subsystem an, in dem das betreffende Modul lokalisiert werden soll.
susyname ist ein String, der entweder den Namen des Subsystems oder eine der folgenden symbolischen Bezeichnungen enthält:
CP
*PRIV
*NONPRIV
*USER
*ALL
es wird im Control-Program, d.h. unter allen Cl1- und Cl2-Modulen gesucht.
es wird in allen privilegierten Subsystemen gesucht.
es wird in allen nichtprivilegierten Subsystemen gesucht.
es wird nur unter den Benutzer-CSECTs gesucht.
es wird überall gesucht.

Soll die Relativadresse eines Kontrollblocks ermittelt werden, muss modname den Feldnamen und susyname die Zeichenfolge „DS“ enthalten. Wird für modname der Name eines Symbols angegeben und handelt es sich bei diesem Symbol um das Element einer Substruktur, das über REFERENCE-Aufrufe lokalisiert wurde, so ist für susyname die Zeichenfolge „RF“ einzutragen (siehe Beispiel bei der Standardprozedur REFERENCE "Standardprozeduren").

Beispiel

A := ADDRESS ('DOPEN', 'CP') ;
MODULE := 'FAUTEM' ;
A := ADDRESS (MODULE, 'ARCHIVE');
A := ADDRESS ('EXVTDSSM','DS');

Wird das Modul oder das Symbol nicht gefunden, dann erhält das Pseudo-Symbol CURRENT.ERROR einen Wert î 0. In diesem Fall ist das zurückgelieferte Ergebnis undefiniert. 

DEC_BINARY
Dezimalzahl umwandeln

Die Standardfunktion DEC_BINARY interpretiert den Inhalt eines Strings als Dezimalzahl und gibt sie als Datum vom Typ „numerisch der Länge 4“ zurück. Dabei werden Leerzeichen vor und nach den relevanten Zeichen ignoriert.

Falls der String keinen gültigen Dezimalwert enthält oder wenn der Wert außerhalb der Grenzen für numerische Variable liegt, wird CURRENT.ERROR gesetzt. Das Ergebnis von DEC_BINARY ist in diesem Fall undefiniert.

Das Einschalten der vorzeichenlosen Arithmetik mit der Standardprozedur UNSIGNED_ON wird ignoriert.

Funktionsaufruf

Operation

Operanden

DEC_BINARY

(string);

Operandenbeschreibung

string

gibt die Stringvariable an, die umgewandelt werden soll.

DEC_STRING
Numerische Werte umwandeln

Die Standardfunktion DEC_STRING wandelt eine angegebene Zahl in einen Dezimalstring um. Das Einschalten der vorzeichenlosen Arithmetik mit der Standardprozedur UNSIGNED_ON wird ignoriert.

Funktionsaufruf

Operation

Operanden

DEC_STRING

(zahl[,länge])

Operandenbeschreibung

zahl

länge

gibt die umzuwandelnde Zahl an.

gibt die Länge des erzeugten Strings an. Die Dezimalzahl wird in den String rechtsbündig eingetragen und nach links mit Leerzeichen aufgefüllt. Reicht die angegebene Länge nicht aus, werden führende Zeichen abgeschnitten.

Ist keine Länge angegeben, werden nur die signifikanten Zeichen zurückgegeben (kompaktes Format ohne führende Leerzeichen).

Ausnahme:

X := DEC_STRING(I) wirkt wie X := DEC_STRING(I,L), wenn X eine bereits initialisierte Stringvariable der Länge L ist.

Nutzt man DEC_STRING ohne Angabe einer Länge zur Initialisierung einer Variablen oder als Parameter in einem für eine eigene PRODAMP-Unterprozedur zu übergebenden Ausdruck, so werden 10 Bytes für das Ergebnis reserviert. In beiden Fällen ist es besser, eine Länge explizit anzugeben.

Beispiel

Auftrag:                                       Ergebnis:
X := 'XXXXXXXX'; ——————————————————————————————————————————————————————  (1) 
X := DEC_STRING (123);                         '     123' 
X := 'XXX'; 
X := DEC_STRING (123456);                      '456' ——————————————————  (2) 
X := 'ABC' + DEC_STRING (12) + 'XYZ';          'ABC12XYZ        ' —————  (3) 
X := 'ABC' + DEC_STRING (12,5) + 'XYZ';        'ABC   12XYZ' ——————————  (4) 

(1)
(2)
(3)
(4)

Initialisierung von X als String der Länge 8;
Initialisierung von X als String der Länge 3;
Keine Initialisierung von X; es ergibt sich ein String der Länge 3 + 10 + 3;
Keine Initialisierung von X, aber der Operand „länge“ bei DEC_STRING erhält den Wert 3 + 5 + 3.

HEX_BINARY
Sedezimalzahl umwandeln

Die Standardfunktion HEX_BINARY interpretiert einen angegebenen String als Sedezimalzahl und reicht das Ergebnis als Datum vom Typ „numerisch der Länge 4“ zurück. Dabei werden Leerzeichen vor und nach den relevanten Zeichen ignoriert.

Falls der String keinen gültigen Sedezimalwert enthält oder wenn der Wert außerhalb der Grenzen für numerische Variable liegt, wird CURRENT.ERROR gesetzt. Das Ergebnis von HEX_BINARY ist in diesem Fall undefiniert.

Funktionsaufruf

Operation

Operanden

HEX_BINARY

(string);

Operandenbeschreibung

string

gibt die Stringvariable an, die umgewandelt werden soll.

HEX_STRING
Numerische Werte umwandeln

Die Standardfunktion HEX_STRING wandelt eine angegebene Zahl in einen Sedezimalstring um.

Funktionsaufruf

Operation

Operanden

HEX_STRING

(zahl[,länge])

Operandenbeschreibung

zahl

länge

gibt die umzuwandelnde Zahl an.

gibt die Länge des erzeugten Strings an. Die Sedezimalzahl wird in den String rechtsbündig eingetragen und nach links mit der Ziffer Null aufgefüllt.
Reicht die angegebene Länge nicht aus, werden führende Zeichen abgeschnitten.

Ist keine Länge angegeben, werden nur die signifikanten Zeichen zurückgegeben (kompaktes Format ohne führende Leerzeichen). Analog zu DEC_STRING gibt es Ausnahmefälle, wenn keine Länge angegeben ist.
Der Compiler reserviert dann gegebenenfalls 8 Stellen für das Ergebnis von HEX_STRING.

Beispiele

Auftrag:                                       Ergebnis: 
X := 'XXXXXXXX';
X := HEX_STRING (123)                          '0000007B'
X := 'XXX';  "zu kurz"
X := HEX_STRING (4097)                         '001'
X noch nicht initialisiert
X := HEX_STRING (123,8)                        '0000007B'
X noch nicht initialisiert
X := HEX_STRING (123)                          '0000007B'

LENGTH
Länge eines Moduls, Kontrollblocks oder Parameterbereichs ausgeben

Die Standardfunktion LENGTH kann in drei Varianten aufgerufen werden:

  • Variante 1: Ausgegeben wird die Länge eines Moduls

  • Variante 2: Ausgegeben wird die Länge eines Kontrollblocks (DSECT/SPL-Struktur, -Unterstruktur, -Feld)

  • Variante 3: Ausgegeben wird die Länge des Parameterbereichs, mit dem die aktuelle Prozedur aufgerufen wurde

Das Ergebnis ist vom Typ „numerisch“ und hat die Länge 4.

Funktionsaufruf

Operation

Operanden

LENGTH

(modname, susyname);

Operandenbeschreibung

modname

Variante 1:„modname“ ist ein Modul-Name, dessen Länge zu bestimmen ist. „modname“ darf höchstens 32 Zeichen enthalten, Leerzeichen vor oder nach dem Modul-Namen sind aber erlaubt.
Variante 2:„modname“ ist der Name eines Kontrollblocks, dessen Länge zu bestimmen ist. Maximal 32 Zeichen, sowie zusätzliche Leerzeichen vor oder nach dem Namen sind erlaubt.
Variante 3:Variante 3: „modname“ ist der String „*PARAMETER“

susyname

Variante 1:Der Name des Subsystems, in dem das Modul gesucht werden soll.
Folgende Werte des Strings „susyname“ haben eine Sonderbedeutung:
CP
*PRIV
*NONPRIV
*USER
*ALL
Es wird im Control-Program, d.h. unter allen Cl1- und Cl2-Modulen gesucht.
Es wird in allen privilegierten Subsystemen gesucht.
Es wird in allen nichtprivilegierten Subsystemen gesucht.
Es wird nur unter den Benutzer-CSECTs gesucht.
Es wird überall gesucht.
Variante 2:„susyname“ enthält „DS“ oder „RF“.
Damit wird angezeigt, dass die Länge eines Kontrollblocks bzw. Feldes zu bestimmen ist. „RF“ ist dann zu nutzen, wenn das Feld Element einer Substruktur ist und zur Lokalisierung REFERENCE Aufrufe benutzt werden.
Variante 3:„susyname“ enthält „DS“ und „modname“ ist der String „*PARAMETER“.

Hinweise

  1. Die Aufrufform LENGTH('*PARAMETER','DS') setzt den Wert von CURRENT.ERROR immer auf 0 und liefert die Gesamtlänge des Parameterbereichs zurück, mit dem die aktuelle Prozedur aufgerufen wurde. Diese Länge ist 0, wenn der Aufruf ohne Parameter erfolgte.

    Beispiele zur Anwendung von LENGTH('*PARAMETER','DS') finden Sie ab "Pseudostrukturen".

  2. Wird LENGTH für ein Modul oder einen Kontrollblock aufgerufen, so kann durch anschließende Auswertung von CURRENT.ERROR bestimmt werden, ob dieses Modul bzw. der Kontrollblock überhaupt gefunden wurde.
    Damit ergibt sich die Möglichkeit, vor einem symbolischen Zugriff mit einem Kontrollblock-Feld die Existenz dieses Kontrollblock-Feldes in den aktuell geladenen Symbolelementen zu überprüfen und entsprechend zu reagieren.

Beispiele

L:=LENGTH('NCTVXVT','CP');
L:=LENGTH('EXVT','DS');
L:=LENGTH('EXVTPRD','DS');
L:=LENGTH('*PARAMETER','DS');
L:=LENGTH('MYDSECT','DS');
IF CURRENT.ERROR <> 0 THEN
" Fehlerfall. Z.B. mit Nachladen der benoetigten Symbole über "
" COMMAND ('ADD-SYMBOLS ...') fortfahren oder Fehlerausgang   "
END IF;

LOCATION
Liefert den Modulnamen zu einer Adresse

Die Standardfunktion LOCATION gibt den Namen des Moduls aus, in dem sich eine angegebene Adresse befindet. Das Ergebnis muss daher einer Stringvariablen zugewiesen werden.

Der Modulname wird in einer maximalen Länge von 32 Zeichen übertragen. Ist die Stringvariable zur Aufnahme des Modulnamens zu kurz, wird abgeschnitten. Ist sie länger als der Modulname, wird der Rest mit Leerzeichen aufgefüllt. Ist die Zielvariable noch nicht initialisiert, bekommt sie den Typ „String“ und die Länge 8.

Entspricht der angegebene Ausdruck keiner Adresse aus einem Modul, setzt LOCATION das Pseudo-Symbol CURRENT.ERROR. Liegt die Adresse im Benutzerspeicher, erhält die Zielvariable den Wert „ABSOLUTE“. Ist das nicht der Fall, erhält sie den Wert „?“.

Die Distanz relativ zum Modulanfang kann anschließend mit der Standardfunktion ADDRESS ermittelt werden.

Funktionsaufruf

Operation

Operanden

LOCATION

(adresse, susyname);

Operandenbeschreibung

adresse

susyname

die Adresse des zu lokalisierenden Moduls.

gibt das Subsystem an, in dem das Modul lokalisiert werden soll.
susyname ist ein String, der entweder den Namen des Subsystems oder eine der folgenden symbolischen Bezeichnungen enthält:

CP
*PRIV
*NONPRIV
*USER
*ALL

es wird im Control-Program, d.h. unter allen Cl1- und Cl2-Modulen gesucht.
es wird in allen privilegierten Subsystemen gesucht.
es wird in allen nichtprivilegierten Subsystemen gesucht.
es wird nur unter den Benutzer-CSECTs gesucht.
es wird überall gesucht.

Beispiel

NAM := LOCATION ( ADDR, 'CP' );
REL := ADDR - ADDRESS ( NAM, 'CP' ) ;

PATTERN
Umwandlung eines numerischen Wertes

Die Funktion PATTERN wandelt einen numerischen Wert in einen Wert vom Typ PATTERN um. Existiert die Ergebnis-Variable noch nicht, dann erhält sie die Länge 4.

Eine solche Umwandlung wird benötigt, wenn z.B. in einer Schleife Daten dahingehend überprüft werden sollen, ob bestimmte Bits gesetzt sind oder nicht. Da keine Operationen verfügbar sind, die z.B. aus P'01' den Wert P'02' erzeugen, ist dies nur über die Umwandlung von numerischen Werten möglich.

Funktionsaufruf

Operation

Operanden

PATTERN

(num)

Operandenbeschreibung

num

gibt den umzuwandelnden numerischen Wert an.

Beispiel

L := 1;
U := 1;
WHILE L < 8 DO
   IF PATTERN ( U ) IN .EXVTULM THEN
      .......
      .......
   END IF;
   U := U * 2;
   L := L + 1;
END WHILE;

PCK_BINARY
Gepackte Zahlen entpacken

PCK_BINARY formt gepackte zu ungepackten Zahlen um. Das Ergebnis ist numerisch von der Länge 4.

Enthält der String keine gepackte Zahl, wird CURRENT.ERROR gesetzt.

Funktionsaufruf

Operation

Operanden

PCK_BINARY

(string)

Operandenbeschreibung

string

gibt die zu entpackende Zahl an.