2013-09-26 79 views
-2

我在COBOL程序中有以下代碼。在COBOL程序中使用BINARY

05 WS-CHARACTER-STRING.        
    10 WS-CHARS-LOW-VALUES  PIC X(08) VALUE X'0000'. 
    10 WS-CHARS    PIC X(08). 
. 
. 
.   
05 WS-BINARY     PIC 9(18) BINARY. 
05 WS-RESULT     PIC 9(18). 
. 
. 
. 
MOVE WKO-DATA-RECORD(116:8) TO WS-CHARS 
DISPLAY ' WS-CHARS:' WS-CHARS    
MOVE WS-CHARACTER-STRING TO WS-BINARY 
DISPLAY ' WS-BINARY:' WS-BINARY   
MOVE WS-BINARY    TO WS-RESULT 
DISPLAY ' WS-RESULT:' WS-RESULT   

傳遞給WS-CHARS的8個字符是不同的有效值。但是,WS-RESULT中的輸出始終是相同的值。我在顯示消息中檢查並且WS-BINARY和WS-RESULT中的值是相同的。首先,我不明白這個邏輯是否有任何意義。如果是這樣,爲什麼我會爲不同的輸入獲得相同的值?

+0

沒有某種上下文,這是無意義的代碼。你能告訴我們你認爲這可能是目標嗎?在此之前,我認爲沒有人能夠提供很多幫助。 – NealB

回答

1

18位二進制只佔用8個字節。

我不認爲這是COBOL編譯器允許組字段(WS-CHARACTER-STRING)移動到二進制字段的「標準」事情。

如果你得到一個常量輸出,它看起來像是一個「字符」MOVE正在對二進制字段進行,所以從WS-CHARACTER-STRING開始的八個字節,它具有一個常數值。如果您告訴我們該值(我懷疑它是X'0000202020202020'作爲十進制數),我們可以確認。

我不能在代碼中看到或猜測代碼的任何用途。我不知道什麼是116:8。在它的表面上,移動WKO-DATA-RECORD(116:8)到WS-BINARY來代替前兩個MOVE會給你帶來不同的結果。結果是否正確完全取決於數據和數據的含義。

通常,用X'0000'作爲二進制值的前綴,然後將結果字段視爲二進制,與除以65536相同,但速度要快得多。但是,如果這是意圖,數據定義將需要不同。

請用盡可能多的信息更新您的問題,包括編譯器名稱和操作系統。

+1

不確定的標準,但大多數Cobol編譯器我看到對待組作爲Pic-X字段 –

+0

是的,我不認爲這是標準的能夠將PIC X移動到BINARY。然而在所顯示的代碼中,它似乎沒有編譯錯誤 - 除非發現一個未被注意到的錯誤,然後運行一個不完整的「對象」,這可能是一種可能性。 –

+0

是的,設置WS-CHARS,然後移動WS-CHARACTER-STRING會在字符集前給你2個空值和6個空格。沒有?我和Bill在這個上面。 00002020 ... –

0

我剛剛使用了一個涉及BINARY,DISPLAY和DISPLAY EDITED數字數據項的代碼示例。

當移動具有不同類型描述的數據項時,編譯器將在內部進行一些調整。

作爲一般規則,您應該避免將數據移動到另一個定義不同的區域。否則,您將收到關於「將數字移動到數字可能會產生意外結果」的診斷消息。這意味着最終的結果可能不是你想要的。我的COBOL手冊的UNISYS系統(IBM配置可能不同),PIC 9(18)BINARY由63位或7個ASCII字節組成。在你的例子中,你將一個16字節的USAGE DISPLAY字段移動到一個7字節的USAGE BINARY字段。

這看起來不是什麼大不了的事情,你會假設編譯器會對DISPLAY到BINARY的值進行內部調整。

但是,數據定義的主要問題是發送和接收數據字段不在字邊界上。 05級數據項不是內部放置在字邊界上的內存中,這意味着這些數據字段的傳輸受到計算機存儲器字的部分分解,然後轉換爲其他數據定義類型。

很可能,16到7字節的移動指令的最終結果產生了一個巨大的二進制值結果,它延續到最後兩個MOVE命令。

該代碼的另一個主要問題是,PIC X使用顯示字段同步向左,而PIC 9使用二進制字段在計算機內同步RIGHT,因此數據對齊,計算機字中的位位置以及強制數據無論WS-CHARS中的原始值如何,類型轉換都會生成「相同的數據移動錯誤」。底線是你有錯誤的編碼。

爲了更好地理解這一點,您需要採用最初編程的彙編語言編程。

+1

七個字節?從什麼時候起,ASCII有9位字節?我們不知道使用了什麼COBOL或OS,但我希望無論如何都使用了64位的9(18)二進制。 –

+0

也許你必須照顧Unisys系統上的邊界對齊。我不知道其他地方你需要打擾。 OP已經有一年多的時間沒有見過,所以不要期望它們有太多的反饋意見。 –