2017-09-21 39 views
3

我有一個調用匯編模塊的COBOL程序。這個模塊返回一個指針,指向這個模塊中獲得的一些數據(我將它稱爲'緩衝區')。 如何將我的工作存儲器中的變量寫入該指針並使用數據?如何從彙編返回的指針指向databuffer到COBOL

在我的COBOL呼叫者我有類似:

工作空間:

01 WK-MOD-AREA. 
    03 WK-MOD-PTR   PIC 9(09) COMP VALUE 0. 

01 WK-BUFFER-PTR   USAGE POINTER. 
01 FILLER     REDEFINES WK-BUFFER-PTR. 
    03 WK-BUFFER-PTR-COMP PIC 9(09) COMP. 
01 WK-BUFFER-DATA   PIC X(5656) VALUE SPACES. 

程序師:

CALL 'MYMOD' USING WK-MOD-AREA. 

MYMOD返回WK-MOD-PTR的地址。

我只是用tryed地址中的數據:

MOVE WK-MOD-PTR TO WK-BUFFER-PTR-COMP. 

SET ADDRESS OF WK-BUFFER-PTR TO WK-BUFFER. 

但它給了我compiller錯誤:

==000657==> IGYPS2161-S "ADDRESS OF" operand "WRK-BUFFER" 
was found as the receiving operand of a "SET" statement, 
but was not a level-01 or level-77 "LINKAGE SECTION" item. 
The statement was discarded. 

在此先感謝。

+1

我假設你的意思是'CALL'MYMOD'使用WK-MOD-AREA'(傳遞變量'BY REFERENCE')而不是'CALL'MYMOD'使用'WK-MOD-AREA' 'BY VALUE')。 –

+0

@SimonSobisch我的壞...這是acctualy被稱爲參考。沒有「引號」。 –

回答

4

你可以做你想做的事,但你不能改變WORKING-STORAGE SECTION中的一個項目的地址,這些項目有一個固定的地址,並在程序第一次被激活時分配。 由於你的編譯器已經告訴你,你可以使用LINKAGE SECTION中的項目來做到這一點,因爲這些項目沒有固定地址,也沒有分配。

,並根據您的實際使用您可以直接通過POINTER的程序,而不是一箇中間變量:

Working-Storage SECTION. 

01 WK-BUFFER-PTR   USAGE POINTER. 

LINKAGE SECTION. 
01 WK-BUFFER-DATA   PIC X(5656) VALUE SPACES. 

Procedure Division. 

CALL 'MYMOD' USING WK-BUFFER-PTR. 
SET ADDRESS OF WK-BUFFER-DATA TO WK-BUFFER-PTR. 

注:

  • 你仍然必須確保的是,數據在使用後在某處被釋放(可能通過調用帶有參數的分配程序來釋放)。
  • 如果它不總是5656字節,您必須確保您不會訪問實際分配長度的字段。爲了確保這一點,您可以使用參考修改WK-BUFFER-DATA (1:actual-length)或可變大小的表格DEPENDING ON(尤其適用於OCCURS UNBOUNDED)。
+1

道具讓我想起25年前的COBOL課程。 –

+0

非常感謝!它按預期工作。 –