2016-06-14 3 views
1

Я хотел бы знать, как получить текущее название абзаца в COBOL (здесь используется MVS Enterprise COBOL V4.2).Как получить текущее название абзаца?

Скажем, у меня есть этот код в PROCEDURE DIVISION:

MAIN-LOGIC. 
     MOVE SPACE TO ABT-MSG 
     PERFORM PARAGRAPH-1 
     PERFORM PARAGRAPH-2 
     GO TO CLOSE-PROGRAM. 
    * 
    * SEARCH FOR A VALUE IN AN ARRAY AND GET THE RELATED INDEX 
    * 
    PARAGRAPH-1. 
     MOVE 42 TO SEARCH-VALUE 
     PERFORM VARYING I-SEARCH FROM 1 BY 1 
      UNTIL SOME-ARRAY(I-SEARCH) = SEARCH-VALUE 
     IF (I-SEARCH = MAX-ARRAY-POSITION) 
      MOVE SEARCH-ABORT TO ABT-MSG 
      MOVE 'PARAGRAPH-1' TO ABT-LOC 
      GO TO CLOSE-PROGRAM 
     END-IF 
     END-PERFORM 
     DISPLAY 'VALUE WAS FOUND AT POSITION ' I-SEARCH '.'. 
    * 
    * STORE A NEW VALUE AT THE END OF AN ARRAY 
    * 
    PARAGRAPH-2. 
     MOVE 42 TO STORAGE-VALUE 
     ADD 1 TO I-STORAGE 
     IF (I-STORAGE > MAX-ARRAY-POSITION) 
     MOVE STORAGE-ABORT TO ABT-MSG 
     MOVE 'PARAGRAPH-2' TO ABT-LOC 
     GO TO CLOSE-PROGRAM 
     END-IF 
     MOVE STORAGE-VALUE TO SOME-ARRAY(I-STORAGE). 
    * 
    * CLOSE THE PROGRAM 
    * 
    CLOSE-PROGRAM. 
     IF ABT-MSG > SPACE 
     DISPLAY ABT-MSG 
     DISPLAY '(FOUND IN ' ABT-LOC ')' 
     MOVE 20 TO RETURN-CODE 
     ELSE 
     DISPLAY SUCCESS-MESSAGE 
     END-IF 
     STOP RUN. 

Я хотел бы иметь возможность доступа к имени текущего абзаца (и сохранить его в ABT-LOC) вместо того, чтобы писать. Есть ли системная переменная COBOL для этого, например, «CURR-PARA-NAME» или что-то еще?

спасибо.

------ UPDATE 1 -------

Я обновил мой пример кода, чтобы сделать его более конкретным. Знайте, что в моей реальной программе COBOL существуют различные возможности возможностей SEARCH-ABORT и STORAGE-ABORT (я работаю со многими массивами).

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

Еще раз спасибо.

------- UPDATE 2 ------

Ну тогда. Кажется, я не могу этого сделать (пользователи моей программы, вероятно, отклонят любые отладочные сообщения, которые они не используют для получения. Для вашей информации я переписываю 50-летнюю программу с очень и очень плохой практикой программирования, например, вверх GO TO, провальная логика и проклятый ALTER, и я хочу получить тот же результат в конце).

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

Я благодарю всех вас за ваше время и желаю вам удачи ... Стек за день!

+0

Какой компилятор COBOL вы используете? –

+0

Как Билл, сказал. В GnuCOBOL есть расширение new-ish, чтобы выставить некоторые размещенные переменные, и я просто сделал небольшой эксперимент, чтобы вернуть указатели на данные трассировки. Это включает в себя текущий идентификатор программы (есть другие способы получения этого), раздел, параграф, исходный файл и номер строки. Похоже на достойное добавление к CBL_OC_HOSTED, но для компиляции для исполняемых файлов требуется значение '-ftrace' или' -ftraceall' для отслеживания данных трассировки шага. Когда он войдет, это будет «CALL» CBL_OC_HOSTED «ИСПОЛЬЗОВАНИЕ paraptr» абзаца «ВОЗВРАТИТЬ ошибочный индикатор». 'paraptr' установлен на' char * 'на успех. –

+0

@BrianTiffin вы должны написать. Я шел другим путем ... –

ответ

2

Поскольку у вас есть псевдокод «что-то плохое произошло здесь», я предполагаю исключение. В этом случае стандартная (COBOL 2002, COBOL 2014) функция EXCEPTION-LOCATION может помочь (хотя фактическая строка определена в соответствии с конструкцией. Я предполагаю, что абзац может быть там [GnuCOBOL, например, имеет формат: program-id; абзац [или абзац OF раздел или раздел, в зависимости от вашей программы]; source-line]).

Если ваш компилятор COBOL предоставляет эту информацию в этой функции, и в этой части не существует никакого исключения: создайте его через subtract 1 from unsigned-var или аналогичный.

Поскольку Билл уже сказал (или подразумевал): это вопрос, когда используемый компилятор COBOL будет наиболее важной частью, если вы должны иметь имена в качестве идентификатора и как метку или нет.

Редактировать (после фактического COBOL компилятор известен):

IBM MVS Enterprise COBOL не имеет функцию EXCEPTION-LOCATION.Поэтому я вижу только одно встроенное решение:

DECLARATIVES. 
debug-declaratives SECTION. 
    USE FOR DEBUGGING ON ALL PROCEDURES. 
debug-par. 
    MOVE debug-name TO current-procedure. 
END DECLARATIVES. 

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

Попробуйте использовать редактор, обеспечивающий макросы (или запуск сценария оболочки на вашем фактическом источнике), чтобы создать источник, который вы передаете компилятору впоследствии.

+0

Я обновил свой пример кода с более конкретными ситуациями. Я бы не стал рассматривать их ИСКЛЮЧЕНИЯ, а скорее ошибки в бизнесе. –

+0

Да, декларация отладки - единственный способ сделать это, и это не должно быть сделано таким образом. –

+0

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

4

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

COBOL - это скомпилированный язык, так что нет никакого автоматического доступа к любому имени или названию имени (абзац или РАЗДЕЛ), если компилятор не сделает что-то доступное. Который, исключая вышеупомянутый случай, это не так.

Это оставляет три подхода: делать это вручную (что вы правильно хотите избежать, так же, как персики, кто-то собирается скопировать или переместить код без изменения литерала); предварительная обработка (с помощью программы или редактора) для автоматического заполнения поля правильной меткой; делать что-то еще.

Поскольку вы неявно дисконтируете первое, снова верю правильно, давайте рассмотрим второе. Что делать, если у вас есть две, три или восемь вещей в том же параграфе/СЕКЦИИ, которые являются «бизнес-ошибками» (хотя обычно эти типы вещей являются более «ошибками целостности», состояние, которое не должно существовать, поэтому не продолжайте) ?

Поскольку вы получите их, решение «предварительной обработки» начнет становиться более уродливым.

Что еще можно сделать?

Ну, это то, с чем мы сталкивались много-много лет. Ответ - уникальный (в пределах программы) номер ошибки. Отдельные ошибки можно назвать, ну и задавать число. Хорошо известную ссылку на ошибку трудно использовать «неправильно». При добавлении новой ошибки трудно дублировать существующий номер. Или, говоря иначе, легко дублировать, но ужасно легко обнаружить при тестировании - «эй, это было 1234, это неправильно».

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

Независимо от того, отличается ли программа с номерами ошибок от остатков ручного обслуживания MOVE 'literal'. Для программ с некоторыми стандартными именами неизвестно. Но вы можете догадаться, что я одобряю и рекомендую.

Теперь, как это сделать для Enterprise COBOL с ДЕКЛАРАЦИЯМИ.

IDENTIFICATION DIVISION. 
    PROGRAM-ID. STAB39. 
    ENVIRONMENT DIVISION. 
    CONFIGURATION SECTION. 
    SOURCE-COMPUTER. FRED DEBUGGING MODE. 

    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 W-WHEN-COMPILED      PIC X(8)BX(8). 
    01 ABT-LOC        PIC X(30). 


    PROCEDURE DIVISION. 
    DDECLARATIVES. 
    DSOME-SECTION SECTION. 
    D USE FOR DEBUGGING ON ALL PROCEDURES 
    D . 
    DSOME-PARA. 
    D MOVE DEBUG-NAME TO ABT-LOC 
    D . 
    DEND DECLARATIVES. 
    STARTING-UP SECTION. 
     DISPLAY 
       ABT-LOC 
    D DISPLAY 
    D   "IT IS STARTING UP" 
     MOVE WHEN-COMPILED   TO W-WHEN-COMPILED 
     DISPLAY 
       "STAB39 " 
       W-WHEN-COMPILED 
     . 
    A-PARA. 
     DISPLAY 
       ABT-LOC 
     PERFORM 
     10 TIMES 
    D  DISPLAY 
        "ITERATING" 
     END-PERFORM 
     . 
    ANOTHER-PARA. 
     DISPLAY 
       ABT-LOC 
     PERFORM      THE-PARA 
            10 TIMES 
     PERFORM      THE-SECOND-PARA 
     GOBACK 
     . 
    THE-PARA. 
     DISPLAY 
       ABT-LOC 
     . 
    THE-SECOND-PARA. 
     DISPLAY 
       ABT-LOC 
     . 

Некоторые примечания:

исток-КОМПЬЮТЕР пункт необходимо использовать COBOLs встроенные средства отладки, включите их. Поэтому также требуется РАЗДЕЛ ОКРУЖАЮЩЕЙ СРЕДЫ и КОНФИГУРАЦИОННЫЙ РАЗДЕЛ. Требуется «имя компьютера», FRED в этом примере, но это не имеет значения. Вы можете «назовите» свой компьютер после вашего любимого любимца или родственника, если хотите, или поместите там что-нибудь там, просто должно быть что-то.

ДЕКЛАРАЦИИ могут быть указаны только в начале раздела ПРОЦЕДУРА. Они должны находиться в СЕКЦИИ, и все действия должны быть в пределах абзаца, принадлежащего СЕКЦИИ. Имена СЕКЦИИ и абзаца не имеют значения, но в любом случае делают их значимыми.

Поскольку ДЕКЛАРАТИВЫ должны содержать РАЗДЕЛ, вам будет предоставлено информационное диагностическое сообщение, если ваша первая метка процедуры не является также СЕКЦИЕЙ. Это не требует использования SECTIONS над параграфами в вашей программе, это не имеет никакого эффекта.

D в столбце 7 обозначает строку отладки. Эти строки генерируют код только при включении отладки с абзацем SOURCE-COMPUTER.

Программа использует все использование абзаца (а использование этого раздела не является исключением для этого примера), кроме GO TO. Пункты GO TO'd будут давать те же результаты, что и любая другая ссылка, но вы не увидите GO TOs в моих программах :-)

Можно назвать процедуру или процедуры, которые вы хотите «поймать», с ДЕКЛАРАЦИЯМИ вместо использования «ВСЕ ПРОЦЕДУРЫ».

У вас может быть несколько процедур DEBUGGING, и вы можете включить в них расширенный код, если хотите (например, настройки условий для тестирования).

Хотя эта функция существует в COBOL в течение длительного времени, вероятно, справедливо сказать, что она широко не используется, особенно по мере того, как стали доступны специальные продукты для отладки.

Недостаточно просто иметь эту программу, для «времени выполнения» необходимо включить DEBUG, если это не значение по умолчанию. Время выполнения в z/OS называется Language Environment и используется несколькими языками (что позволяет легко общаться между языками). Языки включают C/C++, PL/I и Java, а также COBOL. Существуют программы и макросы языковой среды для создания программ HLASM/Assembler «LE Compliant», которые также обеспечивают готовность к взаимодействию.

Чтобы узнать, какие параметры времени выполнения вашего сайта имеют по умолчанию, проще всего включить инструкцию CEEOPTS DD в свой JCL-код запуска.

//CEEOPTS DD * 
    RPTOPTS(ON) 

Это перечислит все варианты, используемые для «Анклав» (среды выполнения) и указать, где каждый вариант поступает из.

Если в столбце ОПЦИЯ вы видите NODEBUG, то отладка COBOL по умолчанию отключена. Для того, чтобы включить его для конкретного запуска:

//CEEOPTS DD * 
    DEBUG 

Это позволит всем D-меченой отладку линии и отладке DECLARATIVES для выполнения.

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

В порядке предпочтения, я рекомендую номера ошибок (и тестирования), автоматизацию, литералы с буквой букв вручную.

IBM полностью документирует все свои продукты, и вы можете найти документацию (Руководство по языку и руководство по программированию среди других) для Enterprise COBOL V4.2, а также языковую среду (несколько) для выпуска z/OS.

Конечная точка. Не используйте GO TO, чтобы «вырваться» из вашего обычного потока обработки. Используйте PERFORM.Даже когда логически PERFORM не может вернуться. Использование GO TO отключит оптимизацию компилятора для параграфов/разделов, содержащих GO TO, которые могут легко вызвать заметное влияние на выполнение. Это противоречит рекомендациям до того, как IBM COBOL обеспечила, чтобы состояние PERFORMed пунктов/разделов не сохранялось между CALL. В то время правильным советом было использовать GO TO. Это уже не правильный совет.

+0

Вы правы: часто бывает недостаточно места для ошибки, чтобы решить указанную ошибку. И иногда у меня есть несколько возможностей прерывания в одном абзаце. Цель моего использования имен абзацев - помочь мне или пользователю быстрее узнать, что случилось. Но эта цель может быть достигнута другими способами, например, как вы сказали, - поместить уникальные номера ошибок для каждого типа ошибки. Как примечание, даже если я не буду использовать ваш код с декларативными, я ценю его. Вы явно знаете намного больше меня на COBOL, и, похоже, вы знаете, о чем говорите. Добрый день! –