2009-06-25 19 views
3

J'ai un certain nombre de drapeaux définis (par un fichier d'en-tête loin en dehors de mon contrôle) qui ressemble à quelque chose comme ceci:Exécution d'un OU binaire en COBOL avec des données Pic X

* 
    * 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'. 

J'ai besoin d'effectuer un OU binaire sur quelques-uns de ces drapeaux, et je me demande s'il existe un moyen facile de le faire que je ne connais pas. Y a-t-il un mot-clé ou une syntaxe simple qui amènera mon programme à traiter ces drapeaux comme des valeurs binaires et à me laisser faire mes calculs, ou est-ce que ce fichier d'en-tête est complètement brisé?

Répondre

3

Je considérerais cette bibliothèque mal écrit. Si vous voulez écrire une bibliothèque de bas niveau à utiliser par COBOL, vous devez choisir des types de données plus faciles à manipuler pour COBOL. Dans ce cas, un élément COMP représentant un mot long (S9 (9) COMP) serait plus facile à gérer pour COBOL.

En supposant que vous un OU ces valeurs ensemble pour faire un appel à une bibliothèque de niveau inférieur, vous pouvez simplement les ajouter ensemble pour obtenir les valeurs de drapeau. Cela fonctionne parce que chaque constante a un seul ensemble de bits.

Vous pouvez déplacer les constantes dans une zone temporaire de Redéfinit, ou profiter du manque de COBOL de sécurité de type et de les transmettre à un sous-programme pour l'opération. Ce qui suit travaillerait sur VMS COBOL:

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. 

Si cela ne fonctionne pas, alors vous aurez besoin d'étudier votre représentation de la plate-forme COBOL d'éléments binaires pour élaborer les bons types.

Je l'ai fait beaucoup de (trop sans doute) les choses de niveau inférieur en COBOL (il y a des décennies). Habituellement, vous pouvez le résoudre. Mais à un moment donné, cela devient trop difficile et ne vaut pas la peine. À ce stade, il est utile de faire appel à un langage (comme C) qui est mieux adapté à la manipulation de bits.

0

opération binaire peut être effectuée à l'aide du COMP. Les champs COMP dans COBOL sont censés contenir les valeurs binaires. Lorsque nous avons calculé ou que l'utilisation des champs COMP binaires est la plus conseillée en COBOL. COMP étant le format binaire peut contenir soit un demi-mot soit un mot entier (c'est-à-dire une longueur de 2 octets ou 4 octets). Ce qui est très similaire à la variable définissant l'assembleur en H ou F, qui correspond à la moitié ou au mot entier qui se traduit par 2 octets ou 4 octets. Ainsi, lorsque l'opération mathématique est effectuée, il est préférable d'utiliser le COMP puis de passer ensuite au champ alphanumérique.

0

Vous pouvez utiliser quatre champs binaires PIC 1 (8) (en supposant une opération de 32 bits) et y déplacer l'élément IPV6, puis effectuer l'opération binaire OR en sélectionnant des bits individuels à utiliser. disponible.