Результатом вашего образца является 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 .