Domanda

Ho un certo numero di flag definiti (da un file di intestazione molto al di fuori del mio controllo) che assomigliano a questo:

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

Devo eseguire un OR binario su alcune di queste bandiere e mi chiedo se esiste un modo semplice per farlo che non sono a conoscenza. Esiste una semplice parola chiave o sintassi che farà sì che il mio programma tratti questi flag come valori binari e mi permetta di fare i miei calcoli, o questo file di intestazione è completamente rotto?

È stato utile?

Soluzione

Considererei questa libreria scritta male. Se hai intenzione di scrivere una libreria di basso livello per l'utilizzo da parte di COBOL, dovresti scegliere tipi di dati più facili da manipolare per COBOL. In questo caso, un elemento COMP che rappresenta una longword (S9 (9) COMP) sarebbe più facile da gestire per COBOL.

Supponendo che tu stia OR-ingingendo questi valori insieme per effettuare una chiamata a una libreria di livello inferiore, potresti semplicemente aggiungerli insieme per ottenere i valori flag. Questo funziona perché ogni costante ha un singolo bit impostato.

È possibile spostare le costanti in un'area di ridefinizione temporanea o sfruttare la mancanza di sicurezza del tipo di COBOL e passarle a un sottoprogramma per l'operazione. Quanto segue funzionerebbe su 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. 

Se questo non funziona, dovrai studiare la rappresentazione della piattaforma COBOL degli elementi binari per determinare i tipi corretti.

Ho fatto molte (troppo probabilmente) cose di livello inferiore in COBOL (decenni fa). Di solito, puoi risolverlo. Ma a un certo punto diventa troppo difficile e non vale la pena. A quel punto vale la pena di chiamare una lingua (come la C) che si adatta meglio ai pezzetti.

Altri suggerimenti

L'operazione binaria può essere eseguita utilizzando COMP. I campi COMP in COBOL dovrebbero contenere i valori binari. Quando abbiamo caluclate o eseguiamo operazioni utilizzando i campi COMP binari sono più consigliabile in COBOL. COMP essendo il formato binario può contenere mezza parola o parola intera (ovvero lunghezza di 2 byte o 4 byte). Che è molto simile all'assemblatore che definisce la variabile in H o F che sta per metà o parola intera che si traduce in 2 byte o 4 byte. Quindi, quando vengono eseguite le operazioni matematiche, è meglio usare il COMP e poi passare al campo alfanumerico.

È possibile utilizzare quattro campi binari PIC 1 (8) (presupponendo un'operazione di parole a 32 bit) e spostare l'elemento IPV6 su di essi, quindi eseguire il binario OR selezionando i singoli bit su cui operare utilizzando PIC 1 si verifica 8 volte se disponibile .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top