如何在 rpg 程序中定义一个可以在调用函数中访问的全局变量

How do you define a global variable in a rpg Program that can be accessed in calling functions

A​​S400 上的角色扮演游戏

它们是否是一种定义全局变量的方法,可以由我的主函数中的函数访问?

例如,我有我的主要 rpg 程序(让我们称之为 "MAIN_PROGRAM",在它里面我调用另一个 RPG 程序(让我们称之为 SUB_PROGRAM)。现在我想定义一个字符串变量 "ABC" 在我的 MAIN_PROGRAM 中,然后在调用我的 SUB_PROGRAM 时使用我的 SUB_PROGRAM.

中的变量

我不想将它作为输入参数发送到 SUB_PROGRAM 的原因是我的 MAIN_PROGRAM 是用生成器 (CA-PLEX) 编译的...这给了我字符串大小的限制为 60 000。我确实找到了解决此问题的方法,但无法将其传递给 SUB_PROGRAM,因为 PLEX 会在 60 000 个字符处将其切断。

我想做的是创建一个可以被 SUB_PROGRAM 引用的全局可变变量。

我是 RPG 编程新手。我可以编辑程序的源代码,但我不知道是否可以创建全局变量或类似的东西。

两个程序之间?编号

在绑定到同一个 *PGM(或 *SRVPGM)对象的两个模块之间,您可以在变量 d-spec 上使用 EXPORTIMPORT 关键字。

如果您必须将它们保留为程序,将数据作为外部数据区传递可能是您的最佳选择。

您使用的是什么版本的 Plex?我从 6.1 开始就没用过它...如果当前版本没有跟上 RPGLE 的步伐,我会感到有些惊讶。

如果您还没有,CA Plex / 2E community 是一个很好的帮助资源。

您可以从服务程序导出变量并将两个程序都绑定到服务程序。您会将变量导入程序。只要程序在同一个激活组中并且服务程序是*CALLER,或者它在同一个命名的激活组中,那么两个程序中的导入变量将访问服务程序中的相同导出变量。

您必须非常小心地定义所有相同的 IMPORT 和 EXPORT 变量。这样做的方法是在 /copy 文件中定义变量,如下所示:

dcl-s shared_variable varchar(1000000)
     /if defined(do_export)
         export
     /else
         import
     /endif
   ;

srvpgm 模块来源:

ctl-opt nomain;
/define do_export
/copy copyfile

程序来源:

/copy copyfile
shared_variable = 'abcde';
if shared_variabe = '12345';
   ...

另一种方法是在服务程序中定义变量,不带EXPORT关键字,使用程序获取和设置值。这似乎比使用 IMPORT/EXPORT 更复杂,但在长 运行 中它可能更容易,因为使用 IMPORT/EXPORT 共享变量导致的问题可能很难调试。例如,如果您不希望变量在明确设置为某个值之前被使用,您的 "get" 过程可以处理该问题。

复制文件:

dcl-s shared_variable_t varchar(1000000);
dcl-pr set_shared_variable;
    val like(shared_variable_t) const;
end-pr;
dcl-pr get_shared_variable like(shared_variable_t) end-pr;

Srvpgm 模块来源:

ctl-opt nomain;
/copy copyfile
dcl-s g_shared_variable like(shared_variable_t);
dcl-proc set_shared_variable export;
   dcl-pi *n;
       val like(shared_variable_t) const;
   end-pi;
   g_shared_variable = val;
end-proc;

程序来源:

/copy copyfile
set_shared_variable ('abcde');
if get_shared_variable () = '12345';
     ...