2010-07-01 322 views
8

我在OpenVMS上運行的COBOL程序中遇到以下問題。COBOL問題轉移到comp-3變量

我有以下變量聲明:

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

以下代碼:

 * 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 

,輸出:

FIELD-A  : 112011 
FIELD-B  : 20100113 
SUB-STRUCT-1 : 112011 
SUB-STRUCT-2 : 20100113 
FIELD-A  : 131323 
FIELD-B  : 23031303 

爲什麼FIELD-AFIELD-B保持值從什麼不同我搬進去他們在第二次測試?

我有其他移動從我的程序DISPLAYCOMP-3變量在那裏我沒有得到這個行爲。

回答

4

在COBOL中,組級別的數據是無類型的,無需轉換即可移動。

元素級別的數據總是有關聯的數據類型。鍵入 數據被鑄造爲在MOVE期間與接收元件的類型 匹配。

在你MOVE字面數值(112011)向壓縮十進制字段和編譯器將其轉換爲在這個過程中正確的數據類型的第一個實例。正如你所期望的任何編程語言一樣。

在第二種情況下,您將MOVE字面值添加到組項。由於這是一個組項目,因此編譯器無法「知道」預期的數據類型,因此它總是作爲字符數據進行移動(不進行數字轉換)。當接收項具有與字符數據兼容的PICTURE子句時,這是很好的 - 其中FIELD-AFIELD-BSUB-STRUCT-1是。當以PIC X存儲時以及以PIC 9存儲時,9的內部表示沒有區別。兩者都假設爲USAGE DISPLAY

現在,當你從SUB-STRUCT-1到COMP-3(壓縮十進制)集團層面打動你有效地告訴編譯器不轉換從DISPLAYCOMP-3格式。這就是你得到的。

嘗試對您的代碼進行以下修改。使用REDEFINES爲移動創建一個數字基本項目 。移動基本數據時,COBOL將執行相應的 數據轉換。


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

以下代碼:


     * 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 

當心:當接收項目中引用移動角色數據到COMP-3場可能會給你可怕的SOC7數據異常異常結束。這是因爲並非所有的位模式都是有效的COMP-3數字。

+0

男人,這把我帶回來。我記得當我們想看看壓縮的十進制字段的最後一個字節時,因爲「04」意味着某人已經在EBCDIC空間中移動了一個值。 – 2010-07-02 15:23:59

+0

@David Thornley。關閉... EBCDIC空間是十六進制「40」。今天我們在壓縮的十進制字段上使用'IF NUMERIC'測試來檢查這種事情。令許多程序員感到困惑的是'MOVE'沒有爆炸,但在此之後,任何對該字段的計算引用都會導致數據異常終止(IBM land中的SOC7)。大多數人都期望'MOVE'能夠將它們炸掉。 – NealB 2010-07-02 15:55:03

+0

不僅僅是關閉:當天,當我們打包字段時,最後一個字節有nybbles交換,所以一個以404040結尾的字符串將結束爲包裝十進制結尾4404(十六進制)。 (這實際上並不是COBOL,但是IBM 360專門設計用於運行COBOL,它有一個ASM指令執行格式化的MOVE,所以我認爲我的ASM經驗在這裏略有相關。) – 2010-07-02 21:09:06

2

您有2個問題。

COBOL有幾個數字數據結構。每個人都有自己的一套規則。

對於PACKED DECIMAL(COMP-3)
•PIC子句的數字組件總是應該總計爲一個ODD編號。 •小數點標記「V」確定小數點的位置。 •單個元素MOVE和數學函數將保持十進制值對齊 - 高位和低位的截斷都是可能的 •將爲您處理數字數據類型轉換(區域十進制打包爲&二進制打包)。

例如S9(5)V9(2)COMP-3。
包括2小數位> 長度被計算爲ROUND UP [(7 + 1)/ 2] = 4字節

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

包括> 長度作爲ROUND UP計算出的2小數位[(8- + 1)/ 2] = 5字節 但是前1/2字節不可尋址

COMP-3字段的最後1/2字節是符號的HEXIDECIMAL表示。
符號½字節值是C =有符號正數D =有符號負數F =無符號(非COBOL)。

S9(6)V9(3)COMP-3 VALUE 123.45。 長度計算爲ROUND UP [(9 + 1)/ 2] = 5個字節
包含X'00 01 23 45 0C'
注意小數對齊&零填充。


組級移動規則

COBOL數據字段結構定義爲層次結構。

的01 HL組字段 - &任何子組水平場 -

  1. 幾乎總是一個隱含的字符串值
  2. 如果單個元件字段是一個01或77電平 - 那麼它可以是數字。
  3. 定義爲組或子組級別下的數字的單個元素字段將被視爲數字,如果引用爲個別元素字段。
  4. 適用數字規則。 ø右對齊 ö小數位對準 O焊盤H-L(1/2字節)用零 ö數字數據類型轉換

一個MOVE或數學計算的接收場確定是否會發生數字數據的轉換。

數字數據轉換 如果移動或使用任何發送字段類型(組或元件),以接收任何單個元素字段使用數字PIC子句定義執行數學運算---然後數字數據轉換將出現在接收領域。當非數字數據移動到接收數字定義字段時或者當使用非數字數據嘗試數學計算時,會發生S0C7異常終止。

沒有數字數據轉換 如果您將任何字段類型(組或子元素)移動到任何組或子組級別字段,那麼將沒有數字數據轉換。
•適用字符MOVE規則。
•左對齊&填充空格。

這是數字定義字段中非數字數據的主要原因之一。

發送組級別MOVE包含數字元素字段到包含數字元素字段(映射相同)的接收組級別的主要用途之一是使用1 MOVE指令重新初始化數字元素字段。

清除掩碼 - 或 - 數據傳播MOVE也可用於表清除 - 表組大小超過255字節。

+0

這在很大程度上是無意義的,並且試圖從中選擇很多有用的東西是浪費時間的練習。 – 2015-07-02 16:59:12