在gnucobol中,全局变量似乎是只读的

问题描述 投票:0回答:1

我目前正在尝试实现一种模式,用 cobol 编写当今的简单程序。

现在的程序是指包含一些彼此可见的变量和过程的源文件。

最接近我的目标的是一个程序列表,每个程序都能够互相调用,而操作系统正在调用第一个程序。

要共享相同的变量,我必须将它们标记为外部。缺点是,它们可能可以在最终链接在一起的其他来源中访问。

IDENTIFICATION DIVISION.
    PROGRAM-ID. MAIN.
DATA DIVISION.
    WORKING-STORAGE SECTION.
        01 MY-NAME PIC X(10) VALUE 'MAIN'.
        01 CALLS PIC 9(3) GLOBAL.
PROCEDURE DIVISION.
    MOVE 0 TO CALLS.
    CALL 'CALL-SHOW' USING MY-NAME, 'CALL-SHOW'.
    CALL 'ROUTINE1' USING MY-NAME.
    CALL 'ROUTINE2' USING MY-NAME.
END PROGRAM MAIN.

IDENTIFICATION DIVISION.
    PROGRAM-ID. CALL-SHOW.
DATA DIVISION.
    WORKING-STORAGE SECTION.
        01 CALLS PIC 9(3) GLOBAL.
    LINKAGE SECTION.
        01 CALLER PIC X(10).
        01 CALLED PIC X(10).
PROCEDURE DIVISION
    USING CALLER, CALLED.
    ADD 1 TO CALLS.
    DISPLAY CALLS ' CALLS' END-DISPLAY.
    DISPLAY CALLER ' CALLED ' CALLED END-DISPLAY.
    GOBACK.
END PROGRAM CALL-SHOW.

IDENTIFICATION DIVISION.
    PROGRAM-ID. ROUTINE1.
DATA DIVISION.
    WORKING-STORAGE SECTION.
        01 MY-NAME PIC X(10) VALUE 'ROUTINE1'.
        01 CALLS PIC 9(3) GLOBAL.
    LINKAGE SECTION.
        01 CALLER PIC X(10).
PROCEDURE DIVISION USING CALLER.
    CALL 'CALL-SHOW' USING CALLER, MY-NAME.
    CALL 'CALL-SHOW' USING MY-NAME, 'CALL-SHOW'.
    CALL 'ROUTINE2' USING MY-NAME.
    GOBACK.
END PROGRAM ROUTINE1.

IDENTIFICATION DIVISION.
    PROGRAM-ID. ROUTINE2.
DATA DIVISION.
    WORKING-STORAGE SECTION.
        01 MY-NAME PIC X(10) VALUE 'ROUTINE2'.
        01 CALLS PIC 9(3) GLOBAL.
    LINKAGE SECTION.
        01 CALLER PIC X(10).
PROCEDURE DIVISION USING CALLER.
    CALL 'CALL-SHOW' USING CALLER, MY-NAME.
    CALL 'CALL-SHOW' USING MY-NAME, 'CALL-SHOW'.
    GOBACK.
END PROGRAM ROUTINE2.

我尝试的另一种方法是一个带有全局变量的程序和嵌入其过程划分中的一些其他程序。这里,全局变量在该程序中很高兴可见,但子程序似乎仅在父程序中可见。

IDENTIFICATION DIVISION.
PROGRAM-ID. DemoGLOBAL.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  Arg GLOBAL                     PIC X(10).
PROCEDURE DIVISION.
000-Main.
    MOVE ALL "X" TO Arg
    CALL "DemoSub" END-CALL
    DISPLAY "DemoGLOBAL: " Arg END-DISPLAY
    CALL "DemoSub2" END-CALL
    DISPLAY "DemoGLOBAL: " Arg END-DISPLAY
    CALL "DemoSub3" END-CALL
    GOBACK
    .
IDENTIFICATION DIVISION.
PROGRAM-ID. DemoSub.
PROCEDURE DIVISION.
000-Main.
    MOVE ALL "*" TO Arg.
    GOBACK
    .
END PROGRAM DemoSub.
IDENTIFICATION DIVISION.
PROGRAM-ID. DemoSub2.
PROCEDURE DIVISION.
000-Main.
    MOVE ALL "?" TO Arg.
    GOBACK
    .
END PROGRAM DemoSub2.
IDENTIFICATION DIVISION.
PROGRAM-ID. DemoSub3.
PROCEDURE DIVISION.
000-Main.
*>    CALL "DemoSub" END-CALL
    GOBACK
    .
END PROGRAM DemoSub3.
END PROGRAM DemoGLOBAL.

是否有更好的方法来获取全源数据和程序?

variables scope procedure gnucobol
1个回答
0
投票

EXTERNAL
变量对整个运行时单元(=进程/pid)可见,并且可以被任何程序访问。它“存储”在运行时中,并且其大小在所有程序中必须相同(否则第一个具有不同大小的程序将中止或无法进行
CALL
ed,具体取决于实现)。

GLOBAL
标准很好地描述了 - 就像您发现它工作的方式一样:

程序中包含的每个程序都可以使用全局名称 声明它。

并不是100%清楚你想要实现什么;但您似乎想要在所有程序中使用通用数据。标准选项是“主”程序(从操作系统启动)在其

WORKING-STORAGE
(提供定义和数据)中具有数据(在抄写本中定义),而其他程序在
LINKAGE
中具有数据(提供仅定义)并在
PROCEDURE DIVISION USING
中引用它(使用程序在
CALL ... USING
上传递的数据)。

如果您需要在独立进程之间共享数据,则只需

LINKAGE
并通过操作系统(或 COBOL 实现)特定功能(如 posix 环境上的
shmget
)共享数据,第一个程序分配动态记忆。

© www.soinside.com 2019 - 2024. All rights reserved.