как использовать GO TO в COBOL - PullRequest
0 голосов
/ 04 мая 2011

У меня есть следующий фрагмент кода в одной из моих программ на COBOL.

IF  FIRST < SECOND
   MOVE FIRST TO WS
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

Мне нужно использовать GO TO внутри блока IF, чтобы перейти к последнему оператору (MOVE WS TO RESULT).

IF  FIRST < SECOND
   MOVE FIRST TO WS
   GO TO <last line.(MOVE WS to RESULT)>
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

Другими словами, мне нужно пропустить "ПЕРЕМЕСТИТЬ ВТОРОЕ В WS.".
Какой самый простой способ перейти к определенной строке в cobol?Я где-то читал, что это возможно путем определения PARAGRAPH, но не знаю, как его определить.

Это может показаться очень простым, но я новичок в программировании на COBOL.

Спасибо.

---------------- * ОБНОВЛЕНИЕ * ----------

на основе решения @lawerence, это правильно??

IF  FIRST < SECOND
     MOVE FIRST TO WS
     GO TO C10-END.
  END-IF.

  MOVE SECOND TO WS.

C10-END.
MOVE WS TO RESULT.

Я только что переместил назад последний оператор на первый уровень.

Ответы [ 5 ]

4 голосов
/ 04 мая 2011

GOTO может делать то, что вы ищете, но IF / ELSE будет более прямым. Вы хотите, чтобы MOVE SECOND TO WS работал, если блок IF не работает, верно?

IF  FIRST < SECOND
    MOVE FIRST TO WS
ELSE
    MOVE SECOND TO WS
END-IF.
MOVE WS TO RESULT. 

Надеюсь, я правильно понял синтаксис, я никогда не использовал COBOL и просто пытался отработать ваш фрагмент и этот пример http://www.fluffycat.com/COBOL/If-and-End-If/. Возможно, в будущем будут ситуации, когда вам понадобится GOTO, но это A) следует избегать, когда будет работать другая структура управления и B) я не имею ни малейшего представления, как это делается

если честно, Кобол выглядит довольно несчастным, лол. Я никогда не видел такой многословный язык. удачи с каждым


EDIT


В основном для Джо ...

Неужели все это лучше сделать с помощью функции min? Я уверен, что синтаксис неправильный, но:

Move Function Min(FIRST, SECOND) to RESULT
2 голосов
/ 05 мая 2011

OMFSM! Это не 1974 год, почему ты так пишешь на Коболе? Это:

IF  FIRST < SECOND
   MOVE FIRST TO WS
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

Имеет ряд проблем:

  • Он использует периоды для разграничения области, что почти три десятилетия устарело.
  • Не использует ELSE
  • Он пытается использовать GO TO.

Могу ли я предложить следующее как способ приблизиться к нему с 1985 года:

If FIRST < SECOND
  Move FIRST to WS
Else
  Move SECOND to WS
End-IF
Move WS to RESULT

Но на самом деле код должен просто читать:

If FIRST < SECOND
  Move FIRST to RESULT
Else
  Move SECOND to RESULT
End-If

Если в WS не требуется промежуточный результат. Кобол 66 и 74 использовали GOTO и периоды, потому что им не хватало современных структур управления. Я понимаю, что вы «новичок», но вам следует предложить тем, кто учит вас, что им действительно необходимо повысить свои навыки.

0 голосов
/ 19 ноября 2016

В нашем магазине мы использовали пример Билла Вуджера.Тем не менее, мы используем точки в качестве ограничителей области.COBOL должен быть структурирован и использовать принцип KISS, как и любой другой язык.Это:

MOVE SECOND TO WS.
IF FIRST LESS THAN SECOND
    MOVE FIRST TO WS.
MOVE WS TO RESULT.

Обратите внимание, что это работает, только если мы уверены, что SECOND и FIRST имеют числовые значения или что WS является строкой PIC X (), а не числовой PIC 9 ().Это, безусловно, легче всего читать.Не требуется ELSE или GO TO.

0 голосов
/ 21 сентября 2014

Новый не-ответ выявил этот глупый вопрос.

ELSE в IF - это 100% очевидный ответ.Крайне странно, что GO TO должен использоваться, тогда как ELSE может не использоваться.

Другой способ, удивленный, что это не подошло:

MOVE SECOND TO WS
IF  FIRST LESS THAN SECOND
   MOVE FIRST TO WS
END-IF
MOVE WS TO RESULT

Нет ELSE, нет GO TO,Дополнительный MOVE выполняется, когда FIRST меньше секунды, однако.

Включить GO TO просто, но глупо.Добавить GO TO.GO TO должен пойти куда-нибудь (если не использует ALTER ... TO PROCEED TO ..., чего все надеялись, что вы не были), поэтому сделайте метку в том месте, куда вы хотите, чтобы она прибыла, и добавьте название этой меткиПерейти к.

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

Метка - это имя процедуры.Имя процедуры должно заканчиваться точкой / полной остановкой, а сама процедура также должна заканчиваться точкой / полной остановкой.

А как насчет MOVE FUNCTION MIN ( ... ) ... как решения?

Ну, это работает.Если другие сотрудники на вашем сайте не привыкли к нему, вы не будете благодарны за его использование (в любом случае, без предварительного обсуждения).

Что он делает?В Enterprise COBOL компилятор генерирует дополнительную небольшую область, копирует первый аргумент в эту область, проверяет второй аргумент, копирует копию первого аргумента или второго аргумента, в зависимости от того, что имеет отношение к результату.

По сравнению с ELSE, это определенная дополнительная область памяти, дополнительная инструкция для адресации этого и дополнительное перемещение Ассемблера (MVC) плюс отсутствие распознавания готовности.

Лучше для программистов, новыхк COBOL, используется для множества функций на других языках?Не совсем, так как они будут разумно избиты, если не будут писать программы, которые могут быть поняты (в 2 часа ночи) остальным персоналом.

IF FUNCTION MIN(VAR1 VAR2 VAR3 VAR4 VAR5) = 17

Это еще один недостаток FUNCTION.Вы видите, вы можете сделать это.Затем, в 2 часа ночи, когда программа потерпела крах 32 строки спустя, после того, как VAR1 и VAR3 были изменены, вы сможете найти результат этого IF в дампе ядра?Может быть, а может и нет.Зависит от того, были ли использованы какие-либо другие функции и какого типа.В 2 часа ночи ты не хочешь этого.Совсем нет.

С другой стороны, это меньше печатать.Для тех, кто печатает, а не пользуется редактором.

0 голосов
/ 04 мая 2011

jon_darkstar прав, когда дело доходит до улучшения логики, однако, если вы хотите увидеть, как работает GO TO, то здесь:

  IF  FIRST < SECOND
     MOVE FIRST TO WS
     GO TO C10-RESULT.
  END-IF.

  MOVE SECOND TO WS.

C10-RESULT.
  MOVE WS TO RESULT.

C10-RESULT. начинается с абзаца и должно быть уникальным именем в вашем коде РАЗДЕЛ. По соглашению он также должен начинаться с того же префикса, что и вмещающий раздел. Поэтому в этом примере предполагается, что ваш код SECTION имеет вид C00-MAIN-PROCESS SECTION.

...