Принятие подписанных значений как части записи - PullRequest
2 голосов
/ 17 апреля 2020

У меня довольно простая c программа Cobol, которую я использую, чтобы узнать о структурах записей. Я замечаю странное поведение с gnucobol при передаче значений чисел c со знаком как части записи в операторе ACCEPT.

Программа определяется следующим образом:

IDENTIFICATION DIVISION.
PROGRAM-ID. TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Account.
  02 Name PIC X(5) VALUE SPACES.
  02 Balance PIC S9999V999 VALUE ZEROES.
PROCEDURE DIVISION.
MAIN.
  DISPLAY "Enter account details:"
  ACCEPT Account.
  DISPLAY "Balance is:"
  DISPLAY Balance.

  STOP RUN.

Поведение выглядит следующим образом:

Enter account details:
AAAAA-123.456
Balance is:
+-123.045

Я предполагаю, что это связано с тем, как значение хранится в необработанной памяти.

Это вообще то, что делает большинство компиляторов cobol? Есть ли способ заставить cobol правильно интерпретировать значение со знаком?

1 Ответ

2 голосов
/ 17 апреля 2020

Я предполагаю, что это связано с тем, как значение хранится в необработанной памяти.

да

Это вообще то, что делает большинство компиляторов кобола?

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

Есть ли способ заставить cobol правильно интерпретировать значение со знаком?

Да, но есть "COBOL", что нужно сделать:

  • хранить данные во внутреннем формате (как вы это сделали: значение со знаком с подразумеваемыми 3 десятичными позициями), но для ACCEPT и, вероятно, также DISPLAY используйте формат, который на самом деле содержит данные, как вы хотите, например PIC +ZZZ9.999$, для некоторых деталей смотрите этот ответ
  • никогда ACCEPT запись, либо разделенная на несколько ACCEPT, либо используйте одну запись с указанием имени экрана, а не имени записи -> используйте SCREEN SECTION для ввода данных, это даст вам два отдельных поля и в большинстве сред COBOL обоснованная проверка ввода.
...