接受带符号的值作为记录的一部分
Accepting signed values as part of a record
我有一个相当基本的 Cobol 程序,我正在使用它来了解记录结构。在 ACCEPT
语句中将带符号的数值作为记录的一部分传递时,我注意到 gnucobol 有奇怪的行为。
程序定义如下:
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 正确解释带符号的值?
I assume this is due to how the value is stored in raw memory.
是
Is this generally what most cobol compilers do?
一个猜测:是的(实际显示会有所不同,但我相信大多数 COBOL 环境不会按照您的意愿行事,至少是这样)
Is there a way to get cobol interpreting the signed value properly?
是的,但是有 "COBOL" 件事要做:
- 以内部格式存储数据(就像您所做的那样:带有隐含 3 个小数位的带符号值),但是对于
ACCEPT
并且可能 DISPLAY
使用实际包含您想要的数据的格式,例如 PIC +ZZZ9.999$
,有关详细信息,请参阅 this answer
- 从不
ACCEPT
一条记录,要么分成多个 ACCEPT
要么使用一个接受屏幕名称的记录,而不是记录名称 - -> 使用 SCREEN SECTION
来输入数据,这将为您提供两个独立的字段,并且在大多数 COBOL 环境下都可以进行合理的输入验证。
我有一个相当基本的 Cobol 程序,我正在使用它来了解记录结构。在 ACCEPT
语句中将带符号的数值作为记录的一部分传递时,我注意到 gnucobol 有奇怪的行为。
程序定义如下:
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 正确解释带符号的值?
I assume this is due to how the value is stored in raw memory.
是
Is this generally what most cobol compilers do?
一个猜测:是的(实际显示会有所不同,但我相信大多数 COBOL 环境不会按照您的意愿行事,至少是这样)
Is there a way to get cobol interpreting the signed value properly?
是的,但是有 "COBOL" 件事要做:
- 以内部格式存储数据(就像您所做的那样:带有隐含 3 个小数位的带符号值),但是对于
ACCEPT
并且可能DISPLAY
使用实际包含您想要的数据的格式,例如PIC +ZZZ9.999$
,有关详细信息,请参阅 this answer - 从不
ACCEPT
一条记录,要么分成多个ACCEPT
要么使用一个接受屏幕名称的记录,而不是记录名称 - -> 使用SCREEN SECTION
来输入数据,这将为您提供两个独立的字段,并且在大多数 COBOL 环境下都可以进行合理的输入验证。