2009-06-25 15 views
3

ich eine Reihe von Flags definiert haben (durch eine Header-Datei weit außerhalb meiner Kontrolle), die wie folgt aussehen:ein binäres OR in COBOL mit Pic X-Daten durchführen

* 
    * OPTVAL field for IPV6_ADDR_PREFERENCES_FLAGS 
    * 
    01 IPV6-ADDR-PREFERENCES-FLAGS PIC X(4). 
    * 
    * IPV6_ADDR_PREFERENCES_FLAGS mappings 
    * 
    77 IPV6-PREFER-SRC-HOME  PIC X(4) VALUE X'00000001'.  
    77 IPV6-PREFER-SRC-COA   PIC X(4) VALUE X'00000002'.  
    77 IPV6-PREFER-SRC-TMP   PIC X(4) VALUE X'00000004'.  
    77 IPV6-PREFER-SRC-PUBLIC  PIC X(4) VALUE X'00000008'.  
    77 IPV6-PREFER-SRC-CGA   PIC X(4) VALUE X'00000010'. 
    77 IPV6-PREFER-SRC-NONCGA  PIC X(4) VALUE X'00000020'. 

ich eine binäre ausführen müssen, OR auf ein paar dieser Flaggen, und ich frage mich, ob es eine einfache Möglichkeit gibt, dies zu tun, die mir nicht bewusst ist. Gibt es ein einfaches Schlüsselwort oder eine einfache Syntax, die mein Programm dazu bringt, diese Flags als binäre Werte zu behandeln und mich mathematisch zu behandeln, oder ist diese Header-Datei einfach komplett kaputt?

Antwort

3

Ich würde diese Bibliothek schlecht geschrieben. Wenn Sie eine Low-Level-Bibliothek für die Verwendung durch COBOL schreiben, sollten Sie Datentypen auswählen, die COBOL leichter manipulieren kann. In diesem Fall wäre ein COMP-Element, das ein Langwort darstellt (S9 (9) COMP), für COBOL leichter zu bewältigen.

Angenommen, Sie verknüpfen diese Werte zusammen, um einen Aufruf an eine untergeordnete Bibliothek zu senden, können Sie sie einfach addieren, um die Merkerwerte zu erhalten. Dies funktioniert, weil jede Konstante ein einzelnes Bit gesetzt hat.

Sie könnten die Konstanten in einen temporären Neudefinitionsbereich verschieben oder die fehlende COBOL-Sicherheit nutzen und sie an ein Unterprogramm für den Vorgang übergeben. Im Folgenden würde auf VMS COBOL arbeiten:

IDENTIFICATION DIVISION. 
PROGRAM-ID. SAMPLEOR. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
* 
* OPTVAL field for IPV6_ADDR_PREFERENCES_FLAGS 
* 
01 IPV6-ADDR-PREFERENCES-FLAGS PIC X(4). 
* 
* IPV6_ADDR_PREFERENCES_FLAGS mappings 
* 
77 IPV6-PREFER-SRC-HOME  PIC X(4) VALUE X'00000001'.  
77 IPV6-PREFER-SRC-COA   PIC X(4) VALUE X'00000002'.  
77 IPV6-PREFER-SRC-TMP   PIC X(4) VALUE X'00000004'.  
77 IPV6-PREFER-SRC-PUBLIC  PIC X(4) VALUE X'00000008'.  
77 IPV6-PREFER-SRC-CGA   PIC X(4) VALUE X'00000010'. 
77 IPV6-PREFER-SRC-NONCGA  PIC X(4) VALUE X'00000020'. 

PROCEDURE DIVISION. 
1. 
    CALL "BINARYOR" 
     USING IPV6-PREFER-SRC-HOME 
       IPV6-PREFER-SRC-COA  
       IPV6-ADDR-PREFERENCES-FLAGS. 
    CALL "BINARYOR" 
     USING IPV6-PREFER-SRC-PUBLIC 
       IPV6-ADDR-PREFERENCES-FLAGS 
       IPV6-ADDR-PREFERENCES-FLAGS. 

    IF IPV6-ADDR-PREFERENCES-FLAGS NOT = X'0000000B' 
     DISPLAY "Failure" 
    END-IF. 

END PROGRAM SAMPLEOR. 

IDENTIFICATION DIVISION. 
PROGRAM-ID. BINARYOR. 

DATA DIVISION. 
WORKING-STORAGE SECTION. 

LINKAGE SECTION. 
01  ARG1  PIC S9(9) COMP. 
01  ARG2  PIC S9(9) COMP. 
01  RESULT  PIC S9(9) COMP. 

PROCEDURE DIVISION USING ARG1 ARG2 RESULT. 
1. 
    ADD ARG1 TO ARG2 GIVING RESULT. 
END PROGRAM BINARYOR. 

Wenn dies nicht funktioniert, dann werden Sie Ihre COBOL-Plattform Darstellung von binären Elementen studieren müssen, um die richtigen Typen zu erarbeiten.

Ich habe in COBOL (vor Jahrzehnten) viel (zu viel wahrscheinlich) niedrigere Dinge getan. Normalerweise können Sie es ausarbeiten. Aber irgendwann wird es zu schwer und es lohnt sich nicht. An diesem Punkt lohnt es sich, zu einer Sprache (wie C) zu rufen, die besser zum Drehen von Bits geeignet ist.

0

Der Binärbetrieb kann mit dem COMP durchgeführt werden. COMP-Felder in COBOL sollen die Binärwerte enthalten. Wenn wir caluclate oder do-Operation mit den binären COMP-Felder haben, sind in COBOL am ratsamsten. COMP, das das Binärformat ist, kann entweder ein Halbwort oder ein Vollwort (d. H. Eine Länge von 2 Bytes oder 4 Bytes) enthalten. Das ist sehr ähnlich dem Assembler, der eine Variable in H oder F definiert, die für ein halbes oder vollständiges Wort steht, das in 2 Byte oder 4 Byte übersetzt wird. Wenn die mathematische Operation ausgeführt wird, ist es besser, den COMP zu verwenden und sich später zu einem alphanumerischen Feld zu bewegen.

0

Sie könnten vier PIC 1 (8) Binärfelder verwenden (32-Bit-Wortoperation vorausgesetzt) ​​und das IPV6-Element an sie verschieben und dann das binäre ODER ausführen, indem Sie einzelne Bits für die Verwendung von PIC 1 wählen verfügbar.