У меня есть следующая подпрограмма COBOL, которая принимает строку, длину и аргумент «boolean». Подпрограмма отображает строку без завершающих пробелов. Длина указана в том случае, если полная длина входной строки отличается от хранилища, используемого в подпрограмме для аргумента строки. «Boolean» указывает, должна ли линия быть показана после отображения строки.CALL arguments (опущен? Literal?)
IDENTIFICATION DIVISION.
PROGRAM-ID. Display-String.
DATA DIVISION.
LOCAL-STORAGE SECTION.
01 i PIC 9(3).
01 Len PIC 9(3).
LINKAGE SECTION.
01 LS-Input-String PIC X(255).
01 LS-Input-Length PIC 9(3).
01 LS-Advancing PIC X.
88 LS-Advance VALUE 'T' WHEN SET TO FALSE 'F'.
PROCEDURE DIVISION USING LS-Input-String, LS-Input-Length,
LS-Advancing.
MOVE LENGTH OF LS-Input-String TO Len
IF ADDRESS OF LS-Input-Length NOT = NULL THEN
MOVE FUNCTION MIN(LS-Input-Length Len) TO Len
END-IF
PERFORM VARYING i FROM Len BY -1
UNTIL i LESS THAN 1 OR LS-Input-String(i:1) NOT = ' '
END-PERFORM
IF i > ZERO
IF LS-Advance THEN
DISPLAY LS-Input-String(1:i)
ELSE
DISPLAY LS-Input-String(1:i) WITH NO ADVANCING
END-IF
ELSE
IF LS-Advance THEN
DISPLAY ' '
END-IF
END-IF
GOBACK.
Это прекрасно работает, когда я называю его как:
MOVE LENGTH OF WS-My-String TO WS-Length
CALL 'Display-String' USING WS-My-String, WS-Length, 'F'
Но я получаю ошибочные результаты для этого (подпрограмма не получает 10
, но пробелы или что-то):
CALL 'Display-String' USING WS-My-String, 10, 'F'
Таким образом, он не принимает литерал для второго аргумента, хотя он интерпретирует правду 3-го аргумента.
случайных вопросов, которые я придумал во время написания этой подпрограммы является:
ли литералы даже допускаются в качестве аргументов в
CALL
? Я прочитал документацию, но у меня проблемы с этим. Я не нашел примеров литералов, но никаких явных заявлений об обратном. Я подозреваю, что прохождение'F'
буквально неверно, но «бывает с работой».Есть ли лучший способ обработки строк различной длины в такой функции?
Есть ли более канонический способ выдачи строки на выход, кроме
DISPLAY ' '
, и без отображения пробела?В идеале я хотел бы иметь возможность опустить аргумент, и пусть по умолчанию взять в
CALL
, но я получил какое-то эталонным ошибку памяти, когда я пытался сделать что-то вроде:CALL 'Display-String' USING OMITTED, 0, 'F'
. Я прочитал некоторую документацию по адресуOMITTED
, но не понимаю, как заставить ее работать.
Я использую cobc (OpenCOBOL) 1.1.0
на Linux версии 3.9.10-100.fc17.i686.PAE (Fedora 17).
@BillWoodger очень извините. Я добавил его к моему вопросу. – lurker
Если вы хотите, чтобы строка LS-Input-String была опущена, вам необходимо использовать код ADDRESS OF, аналогичный тому, что у вас есть для длины. Вам мешает ошибка компилятора. 2.0 лучше, я думаю, но не полностью исправлено. Это будет скоро. Вероятно. Посмотрите здесь, например: https://sourceforge.net/p/open-cobol/discussion/help/thread/210c3831/#572c. Пока ошибка не будет исправлена, вы получите некоторые результаты, которые не относятся к тому, что вы на самом деле делаете. –
@BillWoodger благодарит кучу. Я мог бы отказаться от того, чтобы первый аргумент был пропущен. Это был эксперимент и не очень полезный. Первоначально я неправильно понял, как работает OMITTED, и думал, что он будет использовать значения по умолчанию, указанные в хранилище ссылок подпрограммы. Думаю, я заработаю и получаю 2.0. Я его построил, но в данный момент это огорчает нас о 'libcob.so.4'. Я это выясню. Я знаю, что это не сайт для проверки кода, но если я делаю что-то еще смешное, я ценю отзывы. – lurker