Выполнение двоичного ИЛИ в COBOL с данными Pic X - PullRequest
3 голосов
/ 25 июня 2009

У меня есть определенное количество флагов (заголовочный файл находится далеко от моего контроля), которые выглядят примерно так:

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

Мне нужно выполнить двоичное ИЛИ для некоторых из этих флагов, и мне интересно, есть ли простой способ сделать это, о котором я не знаю. Есть ли простое ключевое слово или синтаксис, который заставит мою программу обрабатывать эти флаги как двоичные значения и позволять мне делать математику, или этот заголовочный файл просто полностью поврежден?

Ответы [ 3 ]

3 голосов
/ 27 июня 2009

Я бы посчитал эту библиотеку плохо написанной. Если вы собираетесь написать низкоуровневую библиотеку для использования в COBOL, вам следует выбрать типы данных, которыми COBOL легче манипулировать. В этом случае для элемента COBOL было бы проще справиться с элементом COMP, представляющим длинное слово (S9 (9) COMP).

Предполагая, что вы объединяете эти значения вместе для вызова библиотеки более низкого уровня, вы можете просто сложить их вместе, чтобы получить значения флага. Это работает, потому что для каждой константы установлен один бит.

Вы можете переместить константы во временную область переопределения или воспользоваться отсутствием безопасности типов в 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), который лучше подходит для смешивания битов.

0 голосов
/ 16 декабря 2010

Вы можете использовать четыре двоичных поля PIC 1 (8) (при условии работы с 32-разрядным словом) и переместить элемент IPV6 к ним, а затем выполнить двоичное ИЛИ, выбрав отдельные биты для работы с использованием PIC 1, которое встречается 8 раз, если доступно .

0 голосов
/ 09 июля 2009

Двоичная операция может быть выполнена с помощью COMP. Поля COMP в COBOL должны содержать двоичные значения. Когда у нас есть caluclate или мы выполняем операцию с использованием двоичных полей COMP, наиболее целесообразно использовать в COBOL. COMP, являющийся двоичным форматом, может содержать либо половину слова, либо полное слово (то есть длину 2 байта или 4 байта). Что очень похоже на переменную, определяющую ассемблер в H или F, которая обозначает половину или полное слово, которое переводится в 2 байта или 4 байта. Поэтому, когда математическая операция выполняется, лучше использовать COMP, а затем перейти к буквенно-цифровому полю.

...