3

私は次のように見えるいくつかのフラグを(私の制御のはるか外にあるヘッダーファイルによって)定義しています:

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

これらのフラグのいくつかに対してバイナリORを実行する必要がありますが、これを実行する簡単な方法がありますが、私は気づいていません。プログラムがこれらのフラグをバイナリ値として処理して計算を実行できるようにする単純なキーワードまたは構文はありますか、それともこのヘッダーファイルは完全に壊れていますか?

4

3 に答える 3

3

私はこのライブラリの書き方が悪いと考えています。COBOL で使用する低レベルのライブラリを作成する場合は、COBOL で操作しやすいデータ型を選択する必要があります。この場合、ロングワードを表す COMP 項目 (S9(9) COMP) の方が、COBOL での処理が容易になります。

これらの値を一緒に OR 演算して下位レベルのライブラリを呼び出すと仮定すると、それらを一緒に加算してフラグ値を取得できます。これは、各定数に 1 つのビット セットがあるため機能します。

定数を一時的な再定義領域に移動するか、COBOL の型安全性の欠如を利用して、操作のためにそれらをサブプログラムに渡すことができます。以下は 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. 

これが機能しない場合は、COBOL プラットフォームのバイナリ項目の表現を調べて、正しい型を判断する必要があります。

私は、COBOLで(数十年前に)低レベルのことをたくさん(おそらく多すぎる)行ってきました。通常、あなたはそれを解決することができます。しかし、ある時点でそれは難しくなりすぎて、苦労する価値がなくなります。その時点で、ビットをいじるのにより適した言語 (C など) を呼び出すのが得策です。

于 2009-06-27T14:45:52.617 に答える
0

COMPを使用して二項演算を実行できます。COBOLのCOMPフィールドは、バイナリ値を保持することになっています。バイナリCOMPフィールドを使用して計算または操作を行う場合は、COBOLで行うことをお勧めします。バイナリ形式のCOMPは、ハーフワードまたはフルワード(つまり、2バイトまたは4バイトの長さ)のいずれかを保持できます。これは、2バイトまたは4バイトに変換されるハーフワードまたはフルワードを表すHまたはFの変数を定義するアセンブラーに非常に似ています。したがって、数学演算を実行するときは、COMPを使用してから、後で英数字フィールドに移動することをお勧めします。

于 2009-07-09T06:06:40.930 に答える
0

4 つの PIC 1(8) バイナリ フィールドを使用し (32 ビット ワード操作を想定)、IPV6 項目をそれらに移動し、PIC 1 を使用して操作する個々のビットを選択することでバイナリ OR を実行できます (利用可能な場合)。

于 2010-12-16T16:36:11.920 に答える