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