64-Bit Integerzahlen in CL

5. Dezember 2013 | Von | Kategorie: Tools, Hot-Tips

Bei dem Auswerten numerischer Nachrichteninformationen in CL stolpert man manchmal über eigentümliche Zahlenwerte oder sogar Laufzeitfehler, die man sich zunächst nicht erklären kann. In diesem Fall sollte man zunächst einen genaueren Blick auf die zugrunde liegende Nachrichtenbeschreibung (MsgD) werfen.

pa12_cvs_MG_6986VON SCOTT KLEMENT

Seit einigen Releases gibt es numerische Nachrichtenfelder, die als Datentyp *UBIN defi niert sind. *UBIN-Felder sind vorzeichenfreie 8-Bit Integerfelder, die erst ab Release IBM i 7.1 in CL direkt unterstützt werden. Ein Beispiel für eine solche Nachricht ist CPC7061 (&4 Einträge von Journal &1 in &2 empfangen), die als Diagnosenachricht des Befehls RCVJRNE gesendet wird. Ein

DSPMSGD CPC7061

und die anschließende Auswahl 2 („Felddaten anzeigen“) ergibt

                            Dezimal-   Var.
Feld     Datenart   Länge   stellen    Länge   Dump
&1   *CHAR      10                         *NO
&2   *CHAR      10                         *NO
&3   *BIN        4                         *NO
&4   *UBIN       8                         *NO

Feld 4 gibt sich als *UBIN zu erkennen, dessen Wert in den Nachrichtendaten ab Stelle 25 auszulesen ist. (Die drei davor liegenden Felder nehmen die ersten 24 Byte der Nachrichtendaten ein.) Wollen Sie dieses numerische 8 Byte Feld bis inklusive Release IBM i 6.1 korrekt auswerten, müssen Sie das traditionelle Verfahren der Zerlegung in zwei 4 Byte Felder mit anschließendem Rechenvorgang anwenden.

Auf das konkrete Beispiel der Nachricht CPC7061 angewendet, bietet sich folgender CL Code an:

DCL     &MsgDta *char 32
DCL     &CountL *uint  4 + Stg(*defined) defvar(&MsgDta 25)
DCL     &CountR *uint  4 + Stg(*defined) defvar(&MsgDta 29)

Die beiden letzten Dcl-Anweisungen sind Unterdefi nitionen des 32 Byte Feldes &MsgDta, vergleichbar mit Datenstruktur-Subfeldern in RPG, mit denen die ersten und letzten 4 Byte des vierten Nachrichtenfeldes explizit angesprochen werden. Um aus diesen beiden 4 Byte Feldern den Wert des 8 Byte *UBIN Feldes zu berechnen, ergänzen wir folgenden CL-Code:

Scott Klement ist technischer Redakteur für NEWSolutions. Außerdem ist er IS Manager der Klement Sausage Co., Inc. Sie erreichen ihn unter iSN (ät) Scott- Klement.com.

Schlagworte: , , , , , , , , , ,

Schreibe einen Kommentar

Sie müssen eingeloggt sein, um einen Kommentar schreiben.