Esecuzione di un OR binario in COBOL con dati Pic X
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?
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 .