Tôi gặp sự cố sau trong chương trình COBOL chạy trên OpenVMS.Vấn đề với COBOL chuyển sang biến comp-3
Tôi có khai báo biến sau đây:
01 STRUCT-1.
02 FIELD-A PIC S9(6) COMP-3.
02 FIELD-B PIC S9(8) COMP-3.
01 STRUCT-2.
03 SUB-STRUCT-1.
05 FIELD-A PIC 9(2).
05 FIELD-B PIC 9(4).
03 SUB-STRUCT-2.
05 FIELD-A PIC 9(4).
05 FIELD-B PIC 9(2).
05 FIELD-C PIC 9(2).
Và đoạn mã sau:
* 1st Test:
MOVE 112011 TO FIELD-A OF STRUCT-1
MOVE 20100113 TO FIELD-B OF STRUCT-1
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1 CONVERSION
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1 CONVERSION
* 2nd Test:
MOVE 112011 TO SUB-STRUCT-1.
MOVE 20100113 TO SUB-STRUCT-2.
MOVE SUB-STRUCT-1 TO FIELD-A OF STRUCT-1
MOVE SUB-STRUCT-2 TO FIELD-B OF STRUCT-1
DISPLAY "SUB-STRUCT-1 : " SUB-STRUCT-1
DISPLAY "SUB-STRUCT-2 : " SUB-STRUCT-2
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1 CONVERSION
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1 CONVERSION
Những kết quả đầu ra:
FIELD-A : 112011
FIELD-B : 20100113
SUB-STRUCT-1 : 112011
SUB-STRUCT-2 : 20100113
FIELD-A : 131323
FIELD-B : 23031303
Tại sao FIELD-A
và FIELD-B
giữ các giá trị khác với những gì Tôi dọn vào cho họ trong thử nghiệm thứ hai?
Tôi khác di chuyển từ DISPLAY
tới COMP-3
các biến trong chương trình của mình mà tôi không nhận được hành vi này.
Người đàn ông, điều này đưa tôi trở lại. Tôi nhớ khi chúng ta muốn xem byte cuối cùng của các trường thập phân được đóng gói, bởi vì một "04" có nghĩa là ai đó đã di chuyển trong một giá trị với một không gian EBCDIC. –
@David Thornley. Đóng ... EBCDIC không gian là hex "40". Hôm nay chúng ta sử dụng phép thử 'IF NUMERIC' trên các trường thập phân được đóng gói để kiểm tra loại điều đó. Một cái gì đó gây nhầm lẫn cho nhiều lập trình viên là 'MOVE' không nổ tung, nhưng bất kỳ tham chiếu tính toán nào cho trường sau đó kết thúc bằng việc đưa ra một ngoại lệ dữ liệu (SOC7 trong IBM land). Hầu hết mọi người mong đợi các 'MOVE' để thổi chúng lên. – NealB
Không chỉ đóng: trở lại trong ngày, khi chúng tôi đóng gói các lĩnh vực, các byte cuối cùng đã nybbles đổi chỗ, do đó, một chuỗi kết thúc 404040 hex sẽ gió lên như là một thập phân đóng gói kết thúc 4404 hex. (Điều này không thực sự là COBOL, nhưng IBM 360 được thiết kế đặc biệt để chạy COBOL, có một lệnh ASM duy nhất đã thực hiện một MOVE được định dạng, vì vậy tôi thấy trải nghiệm ASM của mình hơi liên quan ở đây.) –