Групповая переменная в коболе - PullRequest
2 голосов
/ 04 августа 2011
 01  g1.
     05  h1           PIC X   VALUE 'N'.
         88 s1                     VALUE 'Y'.
         88 s2                     VALUE 'N'.

В приведенном выше коде, каковы будут значения s1 и s2?содержит ли оно значение, указанное в групповой переменной (05), или будет иметь свои собственные значения?

Ответы [ 2 ]

6 голосов
/ 04 августа 2011

S1 и S1 являются именованными условиями.Они будут истинными или не истинными в зависимости от значения H1 (или G1 в данном случае).

Код:

Set S1 to true

приведет к значению H1 (и G1 вслучай вашей конкретной группы), чтобы быть «Y».Если вы выполните:

Set S2 to true

, значение H1 (и снова G1) будет символом 'N'.

Они могут быть проверены с использованием стандартных условий отношения.Например:

Evaluate true
  when S1
    Display "S1 is true"
  when S2
    Display "S2 is true"
End-Evaluate

If S1
  Display "S1 is true"
Else
  Display "S1 is false"
End-If

Бруно раскрыл большинство важных особенностей 88-уровневых или именованных условий, но я чувствую, что важно упомянуть, как они сильно злоупотребляют программами Cobol, которые просто не могутотказаться от своих навыков 1974 года.

Вы часто будете видеть, как люди делают что-то вроде:

Move 'Y' to H1

Это действительно плохая идея по нескольким причинам: - однажды кто-то собирается «двигаться»x 'до H1 "и действительно испортит ваш день - кто-то напишет код вроде" if H1 =' Y '"и сделает невозможным сканирование на предмет использования вашего названного условия

Есть способИзбегайте этого, используйте безымянный байт с вашими именованными условиями.Если ваш элемент данных выглядит следующим образом:

01 G1
  02 ...
  02 Filler Pic X value 'N'.
    03 S1         value 'Y'.
    03 S2         value 'N'. 

Пропустив имя в H1, вы заставите других программистов, работающих с вашим макетом данных, использовать названные вами условия S1 и S2.Это имеет много преимуществ, главное из которых заключается в том, что вы всегда можете сканировать исходный репозиторий на наличие названных условий и легко идентифицировать все изменения.

4 голосов
/ 04 августа 2011

s1 и s2 не содержат значения. Они являются «именованными условиями» (так называемые 88-уровневые) и связаны с другим элементом (условной переменной). Уровень 88 не определяет поле и не занимает место в записи; это просто определение значения.

Именованное условие может использоваться в операторе IF и проверяет, равна ли условная переменная любому из значений, указанных в предложении VALUE именованного условия.

Оператор SET может использоваться для создания именованного условия ИСТИНА (путем присвоения первого из его значений условной переменной).

Использование:

SET s1 TO TRUE 

h1 будет содержать значение 'Y'

Вы можете проверить это значение с помощью

IF h1 = 'Y' или просто IF s1

РЕДАКТИРОВАТЬ: как Джо Цицельбергер упомянул в своем ответе, правильный способ проверки условной переменной является использование именованных условий.

IF s1 THEN

   //do something
ELSE 

   //do somethingElse
END-IF
...