2010-07-01 29 views
8

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-AFIELD-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.

Trả lời

4

Trong COBOL, dữ liệu cấp nhóm không có chữ và được di chuyển mà không cần truyền.

Dữ liệu cấp phần tử luôn có loại dữ liệu được liên kết. Đã nhập dữ liệu để khớp với loại của phần tử nhận trong một số MOVE.

Trong trường hợp đầu tiên, bạn MOVE giá trị bằng chữ số (112011) vào trường thập phân được đóng gói và trình biên dịch chuyển đổi nó thành loại dữ liệu chính xác trong quy trình. Cũng giống như bạn mong đợi trong bất kỳ ngôn ngữ lập trình nào.

Trong ví dụ thứ hai, bạn MOVE giá trị bằng chữ cho một mục nhóm. Vì đây là một mục nhóm nên trình biên dịch không thể 'biết' kiểu dữ liệu dự định để nó luôn di chuyển nhóm dưới dạng dữ liệu ký tự (không có chuyển đổi số). Điều này là tốt khi mục nhận có mệnh đề PICTURE tương thích với dữ liệu ký tự - trong đó FIELD-AFIELD-B trong số SUB-STRUCT-1 là. Không có sự khác biệt trong biểu diễn bên trong của 9 khi được lưu trữ dưới dạng PIC X và khi được lưu trữ dưới dạng PIC 9. Cả hai đều được giả định USAGE DISPLAY.

Bây giờ khi bạn thực hiện chuyển cấp nhóm từ SUB-STRUCT-1 sang COMP-3 (Gói thập phân), bạn sẽ yêu cầu trình biên dịch không chuyển đổi từ định dạng DISPLAY sang COMP-3. Và đó là những gì bạn nhận được.

Hãy thử các sửa đổi sau đối với mã của bạn. Sử dụng REDEFINES tạo một mục số học để di chuyển. COBOL sẽ thực hiện các chuyển đổi dữ liệu thích hợp khi di chuyển dữ liệu sơ cấp.


     01 STRUCT-2.     
      03 SUB-STRUCT-1.   
       05 FIELD-A PIC 9(2). 
       05 FIELD-B PIC 9(4). 
      03 SUB-STRUCT-1N REDEFINES 
       SUB-STRUCT-1 PIC 9(6). 
      03 SUB-STRUCT-2.   
       05 FIELD-A PIC 9(4). 
       05 FIELD-B PIC 9(2). 
       05 FIELD-C PIC 9(2). 
      03 SUB-STRUCT-2N REDEFINES 
       SUB-STRUCT-2 PIC 9(8). 

Và đoạn mã sau:


     * 3RD TEST:           
      MOVE 112011 TO SUB-STRUCT-1.     
      MOVE 20100113 TO SUB-STRUCT-2.     
      MOVE SUB-STRUCT-1N TO FIELD-A OF STRUCT-1  
      MOVE SUB-STRUCT-2N 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 
      DISPLAY "FIELD-B  : " FIELD-B OF STRUCT-1 

Hãy coi chừng: Dữ liệu nhân vật di chuyển vào một lĩnh vực COMP-3 có thể cung cấp cho bạn sợ hãi dữ liệu SOC7 ngoại lệ Abend khi mục nhận được tham chiếu. Điều này là do không phải tất cả các mẫu bit đều là số COMP-3 hợp lệ.

+0

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. –

+0

@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

+0

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.) –

2

Bạn có 2 vấn đề.

COBOL có một số cấu trúc dữ liệu số. Mỗi bộ có các quy tắc riêng.

Đối với bản tóm tắt được đóng gói (COMP-3)
• Các thành phần số của mệnh đề PIC phải LUÔN thêm vào một số ODD. • Dấu thập phân “V” xác định vị trí của dấu thập phân. • Phần tử riêng lẻ MOVE và chức năng toán học sẽ duy trì căn chỉnh giá trị thập phân - cả cắt cao và thấp là có thể • Chuyển đổi loại dữ liệu số (số thập phân thành gói & nhị phân để đóng gói) được xử lý cho bạn.

ví dụ: S9 (5) V9 (2) COMP-3.
trong đó có 2 vị trí thập phân> Thời lượng được tính như ROUND UP [(7 + 1)/2] = 4 byte

 S9(6)V9(2) COMP-3.            

bao gồm các vị trí 2 chữ số thập phân> Thời lượng được tính như ROUND UP [(8 + 1)/2] = 5 byte Nhưng byte thứ nhất không thể định địa chỉ

Byte cuối cùng của trường COMP-3 là biểu diễn HEXIDECIMAL của dấu.
Giá trị ký hiệu are byte là C = ký dương D = ký âm F = unsigned (non COBOL).

S9 (6) V9 (3) COMP-3 VALUE 123.45. Độ dài được tính bằng ROUND UP [(9 + 1)/2] = 5 byte
Chứa X'00 01 23 45 0C ’
Lưu ý căn chỉnh & không đệm.


Nhóm Cấp quy tắc MOVE

cấu trúc lĩnh vực COBOL dữ liệu là xác định cấu trúc như thứ bậc.

Trường nhóm 01 HL - & bất kỳ lĩnh vực phụ cấp nhóm -

  1. là hầu như luôn luôn một CHARACTER chuỗi giá trị mặc nhiên
  2. Nếu một lĩnh vực yếu tố cá nhân là một 01 hoặc 77 độ - sau đó nó có thể là số.
  3. Các trường phần tử riêng lẻ được định nghĩa dưới dạng số dưới cấp độ nhóm hoặc cấp nhóm phụ sẽ được coi là số nếu được tham chiếu dưới dạng trường Phần tử riêng lẻ.
  4. Áp dụng các quy tắc số. o phải biện minh cho o nơi thập phân liên kết o pad H-L (½ byte) với số không o dữ liệu Numeric loại chuyển đổi

Trường nhận của một MOVE hoặc toán học tính toán xác định nếu một chuyển đổi dữ liệu số sẽ xảy ra.

Chuyển đổi dữ liệu số Nếu bạn MOVE hoặc thực hiện phép tính toán bằng cách sử dụng bất kỳ loại trường gửi nào (nhóm hoặc phần tử) cho bất kỳ trường phần tử nhận được nào được xác định bằng mệnh đề PIC số --- thì chuyển đổi dữ liệu số sẽ xuất hiện cho việc nhận cánh đồng. S0C7 abends xảy ra khi dữ liệu không phải là số MOVE 'd đến một trường nhận được xác định bằng số HOẶC khi tính toán toán học được cố gắng sử dụng dữ liệu không phải là số.

Không chuyển đổi dữ liệu số Nếu bạn di chuyển bất kỳ loại trường (nhóm hoặc phần tử) nào vào bất kỳ trường cấp nhóm hoặc nhóm phụ nào thì sẽ KHÔNG có chuyển đổi dữ liệu số.
• Áp dụng các quy tắc MOVE ký tự.
• Trái Justify & pad bằng dấu cách.

Đây là một trong những nguyên nhân chính của dữ liệu không phải số trong một trường được xác định bằng số.

Một trong những mục đích chính của cấp nhóm gửi MOVE có chứa trường phần tử số tới cấp nhóm nhận chứa trường phần tử số (ánh xạ giống hệt) là để khởi tạo lại trường phần tử số sử dụng 1 lệnh MOVE.

Một mặt nạ rõ ràng - hoặc - một truyền dữ liệu MOVE cũng có thể để xóa bảng - trong đó mức nhóm bảng lớn hơn 255 byte.

+0

Điều này rất vô nghĩa và cố gắng để chọn nhiều hữu ích ra khỏi nó là một bài tập trong lãng phí thời gian. –

Các vấn đề liên quan