Тривиальная функция "эхо" в GnuCOBOL - PullRequest
1 голос
/ 25 мая 2020

Как создать X ANY LENGTH функций для обработки строк? Банальный (на других языках) «эхо-ответ» делает что-то неожиданное. Документация, открытые ресурсы и FAQ https://open-cobol.sourceforge.io/faq/index.html#id362 не помогли.

   IDENTIFICATION DIVISION.
   PROGRAM-ID. stdtest.
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION ALL INTRINSIC
       FUNCTION REPLY.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
       01 tst BINARY-SHORT UNSIGNED.
       01 expected PIC S9(6)V9(4) USAGE COMP.
       01 argA PIC S9(6)V9(4) USAGE COMP.
       01 argB PIC S9(6)V9(4) USAGE COMP.
   PROCEDURE DIVISION.
       *> must print whole string instead of first 8 chars
       DISPLAY FUNCTION REPLY("The quick brown fox jumps over the lazy dog").
       STOP RUN.
   END PROGRAM stdtest.

   IDENTIFICATION DIVISION.
   FUNCTION-ID. REPLY.
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION ALL INTRINSIC.
   DATA DIVISION.
   LINKAGE SECTION.
       01 argument PIC X ANY LENGTH.
       01 result.
           05 argument-pointer USAGE POINTER.
   PROCEDURE DIVISION USING BY REFERENCE argument RETURNING result.
       *> https://open-cobol.sourceforge.io/faq/index.html#id362
       MOVE argument TO result.
   END FUNCTION REPLY.

1 Ответ

0 голосов
/ 25 мая 2020

Результатом вашего образца является 8 символов, поскольку возвращаемая группа имеет (на вашем компьютере) 8 байтов (из-за POINTER под ним). Он компилируется без ошибок, поскольку вы ссылаетесь только на элемент группы, который является подразумеваемым буквенно-цифровым c (- group) -item (или национальным-групповым элементом, если вы добавляете USAGE NATIONAL)

Путь к сделайте это с (недавним) "стандартным" COBOL - это элемент переменной длины RETURNING.
Параметры, предоставляемые стандартом для функций: DYNAMIC LENGTH (идеальная версия, но пока не поддерживается в GnuCOBOL) или переменная- группа длины (OCCURS 0 TO ... DEPENDING ON), которая достаточно велика для хранения данных.
Следующий пример должен работать (но приводит к внутренней ошибке [codegen], которая должна быть исправлена ​​в следующей версии 3.1rc1):

       IDENTIFICATION DIVISION.
       FUNCTION-ID. REPLY.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 arg-len   USAGE BINARY-LONG.
       LINKAGE SECTION.
       01 argument  PIC X ANY LENGTH.
       01 result.
          05 filler PIC X OCCURS 0 to 99999 DEPENDING ON arg-len.
       PROCEDURE DIVISION USING BY REFERENCE argument RETURNING result.
           MOVE FUNCTION LENGTH (argument) TO arg-len
           MOVE argument TO result.
       END FUNCTION REPLY.

Примечание. Вы найдете отчет об ошибке и патч для потенциального исправления в системе отслеживания проблем GnuCOBOL как # 641 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...