Does SET ADDRESS OF X TO Y work?


Question:

I have some code that uses M$ALLOC and then assigns the address of an array (in the linkage area) to the space just allocated. Code fragment below. There is a note in the migration section that “SET X TO ADDRESS OF Y” requires compiling with the -cp option to enable full POINTER support. But I am using only "SET ADDRESS OF X TO Y" and am not calling C functions. 
000419    CALL "M$ALLOC" USING IMG-ROW-SIZE,
000420        IMG-ROW-PTR,
000421    SET ADDRESS OF IMG-ROW TO IMG-ROW-PTR,
Where IMG-ROW is an array in the linkage section.

Answer:

The answer is yes. SET ADDRESS OF X TO Y is supported. Use the -ca compiler option. 

Note: If you plan to exchange pointers with C functions then enable full POINTER support by compiling with the -cp option.

If you are using a USAGE POINTER item internally, within COBOL (i.e. not to pass to C functions), SET X TO HANDLE OF Y works as desired and gives the same behavior as SET X TO ADDRESS OF Y in ACUCOBOL.

In addition, "SET ADDRESS OF X TO Y" works as expected.

Because of Java constraints, with isCOBOL, M$ALLOC returns a handle, not an actual memory address. When you set the address of a linkage item to the handle value, the program behaves as desired because internally Java uses handles to identify objects, not pointers. 

If you compile with -ca, then the program you described will compile and run as it did with ACUCOBOL. If you don't compile with -ca then you simply need to change USAGE POINTER to USAGE HANDLE wherever it occurs in the data division.

Here is an example program: 
       id division.
       program-id. malloctest.
       data division.
       working-storage section.
       77 img-row-ws pic x(50).
       77 img-row-ptr usage handle.
       linkage section.
       01 img-row.
         03 filler pic x occurs 50.
       procedure division.
       main-logic.
        set address of img-row to address of img-row-ws.
        move "Message 1" to img-row.
        display img-row.
        move "Message 2" to img-row.
        display img-row-ws.
        move "Message 3" to img-row-ws.
        display img-row.
        move "Message 5" to img-row-ws.

        CALL "M$ALLOC" USING length of img-row,
            IMG-ROW-PTR,
        SET ADDRESS OF IMG-ROW TO IMG-ROW-PTR,
 
        move "Message 4" to img-row.
        display img-row.
        display img-row-ws.
        move "Message 6" to img-row-ws.
        move "Error" to img-row.
        display img-row-ws.
The output of program is: 

Message 1
Message 2
Message 3
Message 4
Message 5
Message 6




Article ID: 60
Created: August 31, 2009
Last Updated: August 31, 2009
Author: Support KB Author

Online URL: https://support.veryant.com/phpkb/article.php?id=60