gpt4 book ai didi

ibm-midrange - 从被调用程序获取返回值返回到 rpgle 中的主程序

转载 作者:行者123 更新时间:2023-12-04 22:39:43 25 4
gpt4 key购买 nike

我正在尝试获得 RPGLE 和 IBM i 方面的经验并不断学习。由于野外的大多数代码似乎都是经典的位置代码,我会坚持使用它来适应它。所以我宁愿不使用/free —/end-free 的东西。顺便说一句,我在只有 V4R5 的旧 9401-150 上执行此操作。

TL;DR:如何从外部调用 ILE 程序(具有自己的 MAIN 部分,即它本身是独立的)在其自己的激活组( *NEW )中将返回值返回给被调用者?

我已经准备好一个子文件程序并且运行良好。我想调用一个外部程序来处理子文件中 OPT 值的请求。所以我在被调用者的 D-Specs 中定义了一个 PR:

DROEDETPG         PR                  EXTPGM('ROEDETPG')
DC_MODE LIKE(MODE)
DC_TYP LIKE(TYP)

后来,我调用了也可以正常工作的程序。
C                   SELECT
C OPT WHENEQ '2'
C MOVE 'CHG' MODE
C CALLP ROEDETPG(MODE:TYP)
C ENDSL

这是被调用程序的入口点:
C     *ENTRY        PLIST
C PARM C_MODE 3
C PARM C_TYP 16

现在,也许我要更改的记录已被锁定。所以,我使用 CHAIN(E)在外部程序中获取 %STATUS来自 CHAIN 之后的 PF .其状态值为 1218,我想将此值返回给调用程序,因此它可能会使用消息行告诉用户,该记录目前已锁定且不可用。

我在网上只能找到调用原型(prototype)并定义可能仅适用于过程的调用接口(interface) (PI)。

所以我想到了一个“临时文件”,因为我在 Unix/Linux 上的 Bash 和 C 中习惯了这个目的。好像没有 mktemp()等效,但我可以在 QTEMP 中创建具有相同名称的文件。这适用于文件类型 *DTAARA .不幸的是(意料之中?)这个文件只对调用程序可见。也许可以用 SENDERID(*YES) 创建一个全局键控 *DTAQ但也许这是矫枉过正?

我为什么不把外部程序中的功能放到一堆函数里用 CALLP ?嗯,我还在学习。我决定将子程序中的内容移出主源,以结束子程序执行操作时涉及的状态更改的持续麻烦。当 SR 执行 READ 时,数据库指针指向另一条记录,这在继续子文件内容时会带来大量不稳定的行为。

另外,全局变量(字段内容)会被覆盖,这会添加更多代码以将内容移到一边,保存数据库的键值,再次调用 SR 并恢复变量并执行 SETLL回到我之前的状态。我希望这会更容易,但也许我在 ile rpg 方面还是个新手。

我愿意接受有关如何正确避免我的潜在问题(文件指针和全局变量)的其他建议。

最佳答案

因为 ILE 中的参数是通过引用传递的,所以从外部程序获取一个或多个返回值的一种简单方法是在原型(prototype)和调用的程序参数中定义它们。来自其他编程环境,这对我来说有点奇怪,因为我被洗脑成 BYVAL不是 BYREF这么多年了,但实际上这只是一个函数的返回值,一个堆栈上的值,它被传递回调用者。某些语言会将这些定义为 out参数,但它们实际上是 inout你像对待 out 一样对待.

 DROEDETPG         PR                  EXTPGM('ROEDETPG')
DC_MODE LIKE(MODE)
DC_TYP LIKE(TYP)
DC_ERR 7



C *ENTRY PLIST
C PARM C_MODE 3
C PARM C_TYP 16
C PARM C_ERR 7

这种方法的一个优点是,与其像大多数编程语言中的 RPGLE 子过程和函数那样返回一个值,您可以为给定任务返回任意数量的值,而无需定义数据结构来保存它们。

QTEMP 是一个很棒的库,但我认为创建一个文件对于通过简单的参数传递可以完成的事情来说太过分了。不过,我确实认为您可能对 QTEMP 有一些误解。它是在每个作业的基础上定义的,所以如果你在那里写一些东西(在文件或用户空间对象中,如果你对指针感到满意,这可能比文件更方便),它绝对可以用于其他程序在该作业中运行以查找,直到作业结束或被明确删除。做一些实验来确认这一点,如果有必要,问一个单独的问题,因为它确实应该能够用作多个程序的共享存储。

关于ibm-midrange - 从被调用程序获取返回值返回到 rpgle 中的主程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51383788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com