8 Stimmen

Problem mit COBOL-Umstellung auf Comp-3-Variable

Ich habe das folgende Problem in einem COBOL-Programm, das auf OpenVMS läuft.

Ich habe die folgende Variablendeklaration:

       01 STRUCT-1.
           02 FIELD-A       PIC S9(6) COMP-3.
           02 FIELD-B       PIC S9(8) COMP-3.

       01 STRUCT-2.
           03 SUB-STRUCT-1.
               05 FIELD-A   PIC 9(2).
               05 FIELD-B   PIC 9(4).
           03 SUB-STRUCT-2.
               05 FIELD-A   PIC 9(4).
               05 FIELD-B   PIC 9(2).
               05 FIELD-C   PIC 9(2).

Und der folgende Code:

      * 1st Test:     
           MOVE 112011   TO FIELD-A OF STRUCT-1
           MOVE 20100113 TO FIELD-B OF STRUCT-1

           DISPLAY "FIELD-A       : " FIELD-A OF STRUCT-1 CONVERSION
           DISPLAY "FIELD-B       : " FIELD-B OF STRUCT-1 CONVERSION

      * 2nd Test:
           MOVE 112011   TO SUB-STRUCT-1.
           MOVE 20100113 TO SUB-STRUCT-2.
           MOVE SUB-STRUCT-1 TO FIELD-A OF STRUCT-1
           MOVE SUB-STRUCT-2 TO FIELD-B OF STRUCT-1

           DISPLAY "SUB-STRUCT-1  : " SUB-STRUCT-1
           DISPLAY "SUB-STRUCT-2  : " SUB-STRUCT-2
           DISPLAY "FIELD-A       : " FIELD-A OF STRUCT-1 CONVERSION
           DISPLAY "FIELD-B       : " FIELD-B OF STRUCT-1 CONVERSION

Welche Ausgaben:

FIELD-A       :  112011
FIELD-B       :  20100113
SUB-STRUCT-1  : 112011
SUB-STRUCT-2  : 20100113
FIELD-A       :  131323
FIELD-B       :  23031303

Warum FIELD-A y FIELD-B Werte halten, die sich von denen unterscheiden, die ich im zweiten Test in sie eintrage?

Ich habe andere bewegt sich de DISPLAY a COMP-3 Variablen in meinem Programm, bei denen dieses Verhalten nicht auftritt.

5voto

NealB Punkte 16282

In COBOL sind die Daten auf Gruppenebene typfrei und werden ohne Casting verschoben.

Daten auf Elementebene haben immer einen zugehörigen Datentyp. Typisierte Daten werden so gecastet, dass sie mit dem Typ des empfangenden Elements während einer MOVE .

In der ersten Instanz müssen Sie MOVE einen buchstäblichen numerischen Wert ( 112011 ) in ein gepacktes Dezimalfeld und der Compiler konvertiert es dabei in den richtigen Datentyp. So wie Sie es in jeder Programmiersprache erwarten würden.

Im zweiten Fall müssen Sie MOVE einen literalen Wert zu einem Gruppenelement. Da es sich um ein Gruppenelement handelt, kann der Compiler den beabsichtigten Datentyp nicht "kennen", so dass er Gruppenverschiebungen immer als Zeichendaten durchführt (keine numerischen Konvertierungen). Dies ist in Ordnung, wenn das empfangende Element einen PICTURE Klausel, die mit Zeichendaten kompatibel ist - die FIELD-A y FIELD-B von SUB-STRUCT-1 sind. Es gibt keinen Unterschied in der internen Darstellung einer 9 wenn gespeichert als PIC X und bei Speicherung als PIC 9 . Beide werden angenommen USAGE DISPLAY .

Wenn Sie nun eine Gruppenstufe von SUB-STRUCT-1 in eine COMP-3 (Packed Decimal) umzuwandeln, teilen Sie dem Compiler mit, dass er nicht von DISPLAY a COMP-3 Format. Und das ist es, was Sie bekommen.

Versuchen Sie die folgenden Änderungen an Ihrem Code. Verwendung von REDEFINES erstellt einen numerischen Elementarposten für die Bewegung. COBOL führt die entsprechenden Datenkonvertierungen durch, wenn elementare Daten verschoben werden.

       01 STRUCT-2.                  
           03 SUB-STRUCT-1.          
               05 FIELD-A   PIC 9(2).
               05 FIELD-B   PIC 9(4).
           03 SUB-STRUCT-1N REDEFINES
              SUB-STRUCT-1  PIC 9(6).
           03 SUB-STRUCT-2.          
               05 FIELD-A   PIC 9(4).
               05 FIELD-B   PIC 9(2).
               05 FIELD-C   PIC 9(2).
           03 SUB-STRUCT-2N REDEFINES
               SUB-STRUCT-2 PIC 9(8).

Und der folgende Code:

      * 3RD TEST:                                         
           MOVE 112011   TO SUB-STRUCT-1.                 
           MOVE 20100113 TO SUB-STRUCT-2.                 
           MOVE SUB-STRUCT-1N TO FIELD-A OF STRUCT-1      
           MOVE SUB-STRUCT-2N TO FIELD-B OF STRUCT-1      
           DISPLAY "SUB-STRUCT-1  : " SUB-STRUCT-1        
           DISPLAY "SUB-STRUCT-2  : " SUB-STRUCT-2        
           DISPLAY "FIELD-A       : " FIELD-A OF STRUCT-1 
           DISPLAY "FIELD-B       : " FIELD-B OF STRUCT-1 

Vorsicht! Das Verschieben von Zeichendaten in ein COMP-3-Feld kann zu dem gefürchteten SOC7-Datenausnahmeabbruch führen, wenn auf die empfangende Position verwiesen wird. Dies liegt daran, dass nicht alle Bitmuster gültige COMP-3-Zahlen sind.

2voto

user396088 Punkte 59

Sie haben 2 Probleme.

COBOL verfügt über mehrere numerische Datenstrukturen. Jede hat ihren eigenen Satz von Regeln.

Für PACKED DECIMAL ( COMP-3 )
- Die numerischen Komponenten der PIC-Klausel sollten sich IMMER zu einer ODD-Zahl addieren. - Das Dezimalzeichen "V" bestimmt die Platzierung des Dezimalpunkts. - Die einzelnen MOVE- und mathematischen Funktionen behalten die Ausrichtung des Dezimalwerts bei - sowohl das Abschneiden auf hoher als auch auf niedriger Ebene ist möglich - Die Konvertierung numerischer Datentypen (Zone dezimal nach gepackt und binär nach gepackt) wird für Sie erledigt.

z.B. S9(5)V9(2) COMP-3.
einschließlich der 2 Nachkommastellen> Die Länge wird berechnet als ROUND UP[ (7 + 1) / 2] = 4 Bytes

     S9(6)V9(2) COMP-3.                                            

einschließlich der 2 Nachkommastellen > Die Länge wird berechnet als ROUND UP[(8 + 1) / 2] = 5 Bytes Aber das 1 ½ Byte ist nicht adressierbar

Das letzte ½ Byte der COMP-3-Felder ist die HEXIDECIMAL-Darstellung des Vorzeichens.
Die Vorzeichen ½ Byte Werte sind C = vorzeichenbehaftet positiv D = vorzeichenbehaftet negativ F = vorzeichenlos (nicht COBOL).

S9(6)V9(3) COMP-3 WERT 123,45. Die Länge wird berechnet als ROUND UP[(9 + 1) / 2] = 5 Bytes
Enthält X'00 01 23 45 0C'.
Beachten Sie die Ausrichtung der Dezimalstellen und das Auffüllen mit Nullen.


MOVE-Regeln auf Gruppenebene

COBOL-Datenfeldstrukturen werden als hierarchische Strukturen definiert.

Das Gruppenfeld 01 H-L - & jedes Feld auf Untergruppenebene -

  1. Ist fast immer ein implizierter CHARACTER-String-Wert
  2. Handelt es sich bei einem einzelnen Elementfeld um eine 01- oder 77-Ebene, so kann es numerisch sein.
  3. Einzelne Elementfelder, die auf Gruppen- oder Untergruppenebene als numerisch definiert sind, werden als numerisch behandelt, wenn auf sie als einzelnes Elementfeld verwiesen wird.
  4. Es gelten numerische Regeln. o Rechtsbündig o Ausrichtung der Dezimalstellen o H-L (½ Byte) mit Nullen auffüllen o Konvertierung numerischer Datentypen

Das Empfangsfeld einer MOVE- oder mathematischen Berechnung bestimmt, ob eine numerische Datenkonvertierung stattfindet.

Konvertierung numerischer Daten Wenn Sie eine mathematische Berechnung unter Verwendung eines beliebigen Sendefeldtyps (Gruppe oder Element) in ein einzelnes Empfangselementfeld, das mit einer numerischen PIC-Klausel definiert wurde, verschieben oder durchführen, erfolgt eine numerische Datenkonvertierung für das Empfangsfeld. S0C7-Abbrüche treten auf, wenn nichtnumerische Daten in ein numerisch definiertes Empfangsfeld MOVE'd werden ODER wenn mathematische Berechnungen mit nichtnumerischen Daten versucht werden.

Keine Konvertierung numerischer Daten Wenn Sie einen beliebigen Feldtyp (Gruppe oder Element) in ein beliebiges Feld auf Gruppen- oder Untergruppenebene verschieben, findet keine numerische Datenkonvertierung statt.
- Es gelten die Regeln der Charakterverschiebung.
- Linksbündig ausrichten und mit Leerzeichen auffüllen.

Dies ist eine der Hauptursachen für nichtnumerische Daten in einem numerisch definierten Feld.

Einer der wichtigsten Verwendungszwecke eines MOVE-Befehls auf Sendegruppenebene, der numerische Elementfelder enthält, für eine Empfangsgruppenebene, die numerische Elementfelder enthält (die identisch abgebildet werden), ist die Neuinitialisierung numerischer Elementfelder mit einem MOVE-Befehl.

Eine Clear-Maske - oder - ein Datenpropagations-MOVE ist auch für Tabellen-Clears möglich, bei denen die Tabellengruppen-Ebene größer als 255 Byte ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X