概要
数値を返す組み込み関数(FUNCTION LENGTH, FUNCTION MEANなど)の結果をCALL文の引数として渡した場合、callee側で正しい値が表示されない。
原因
INTRINSIC関数がCOB_TYPE_NUMERIC_BINARY形式でデータを格納するのに対し、callee側がCOB_TYPE_NUMERIC_DISPLAY(ASCII数字)として解釈するため、バイナリデータがそのまま出力されてしまう。
再現コード
FUNCTION LENGTH の例
caller.cob:
IDENTIFICATION DIVISION.
PROGRAM-ID. caller.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 X PIC X(5) VALUE "HELLO".
PROCEDURE DIVISION.
CALL "callee" USING FUNCTION LENGTH(X)
END-CALL.
STOP RUN.
callee.cob:
IDENTIFICATION DIVISION.
PROGRAM-ID. callee.
DATA DIVISION.
LINKAGE SECTION.
01 LEN PIC 9(4).
PROCEDURE DIVISION USING LEN.
DISPLAY LEN
END-DISPLAY.
EXIT PROGRAM.
- 期待される出力:
0005
- 実際の出力:
^@^@^@^@(NULLバイト4つ。バイナリ値がそのまま出力される)
FUNCTION MEAN の例
caller.cob:
IDENTIFICATION DIVISION.
PROGRAM-ID. caller.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(3)V9(2) VALUE 10.50.
01 WS-NUM2 PIC 9(3)V9(2) VALUE 20.30.
01 WS-NUM3 PIC 9(3)V9(2) VALUE 30.20.
PROCEDURE DIVISION.
CALL "callee" USING
FUNCTION MEAN(WS-NUM1 WS-NUM2 WS-NUM3)
END-CALL.
STOP RUN.
callee.cob:
IDENTIFICATION DIVISION.
PROGRAM-ID. callee.
DATA DIVISION.
LINKAGE SECTION.
01 X PIC 9(3)V9(2).
PROCEDURE DIVISION USING X.
DISPLAY X
END-DISPLAY.
EXIT PROGRAM.
- 期待される出力:
020.33
- 実際の出力: 文字化け(バイナリデータがそのまま出力される)
備考
概要
数値を返す組み込み関数(
FUNCTION LENGTH,FUNCTION MEANなど)の結果をCALL文の引数として渡した場合、callee側で正しい値が表示されない。原因
INTRINSIC関数が
COB_TYPE_NUMERIC_BINARY形式でデータを格納するのに対し、callee側がCOB_TYPE_NUMERIC_DISPLAY(ASCII数字)として解釈するため、バイナリデータがそのまま出力されてしまう。再現コード
FUNCTION LENGTH の例
caller.cob:
callee.cob:
0005^@^@^@^@(NULLバイト4つ。バイナリ値がそのまま出力される)FUNCTION MEAN の例
caller.cob:
callee.cob:
020.33備考
FUNCTION UPPER-CASEなど)については Fix C-style code generation for intrinsic function data in CALL statements #797 で対応済み。