我开始使用RPGLE,我试图确定是否有任何方法只在我的服务程序中定义一次参数。我知道我可以将原型放在一个副本成员(我已经完成)中,但是我仍然必须将相同的代码放在过程的主体中(“过程接口”)。
我的问题是,是否有某种方法可以使用原型在过程界面中定义参数(反之亦然)?
理想情况下,如:
原型:
D buildForm PR
D formType 10A CONST
D mode 4A CONST
步骤:
P buildForm B
D buildForm PI
D formType LIKE(formType)
D mode LIKE(mode)
好吧,理想情况我只能在程序正文中说“使用原型”或者其他东西,或者编译器会自己找到它......
我是否误解了原型和程序接口是如何设置的,或者在正确完成时它们实际上是重复的:
原型:
D buildForm PR
D formType 10A CONST
D mode 4A CONST
步骤:
P buildForm B
D buildForm PI
D formType 10A CONST
D mode 4A CONST
感谢阅读。
答案 0 :(得分:4)
在7.1中,如果要在使用它的同一程序中定义子过程,则不需要原型。如果您从服务程序或绑定模块中使用子过程,则只需要原型(不要将模块绑定到程序!)
我个人并不觉得创建这个原型很麻烦。我复制PI,将其更改为PR,将其放入/ copy成员并在许多程序中使用它,如下所示:
/copy buck/qprotosrc,buildform
...
buildform(form: mode);
我需要'双重定义'的唯一时间是PI所在的服务程序。避免大部分的方法是使用条件编译。这是一个例子:
qprotosrc(buildform)
// Build form prototype and start of interface
// Service program will complete the interface with P E
/if not defined(buildform_proto)
/define buildform_proto
D buildForm PR
/else
P buildForm B
D buildForm PI
/endif
D formType 10A CONST
D mode 4A CONST
QRPGLESRC(mysrvpgm)
/copy buck/qprotosrc,buildform
...
/copy buck/qprotosrc,buildform
// body of buildform here
...
return;
p e
第一次处理/副本时,它会插入原型 - 这是您想要的所有消费者程序。作为处理的一部分,它定义了buildform_proto。在您的服务程序中,您需要输入第二个/副本。由于定义了buildform_proto,因此编译器会插入P ... B和D ... PI规范。您必须提供程序正文和P ... E规范。
答案 1 :(得分:3)
它只会让您免于复制和放弃粘贴parm列表。但它实际上更多的击键。我是“不要重复自己”的忠实粉丝,但我不认为这是重复,而是冗余会增加错误捕获。如果PI和PR之间存在不匹配,编译器会通知您。
正如我在Bucks帖子中的评论中提到的那样,你可能会遇到问题。假设您的包含源不仅仅是原型键入其他有用的定义,那么在某些时候您可能会发现包含多个位置的包含文件。对此的修复只是在每个包含
的顶部/if defined(MYPROTO_INC)
/EOF
/endif
/define MYPROTO_INC
现在无论在编译器中拉出多少次,只会看到一次定义。
如果多次看到相同的定义,编译将失败,我认为不要故意包含相同的源是个好主意。即使通过玩游戏,我们在技术上也不能包含相同的符号定义。
此外,请考虑模仿您的参与..
d formType_t S 10a template
d formMode_t s 4a template
D buildForm PR
D type CONST like(formType_t)
D mode CONST like(formMode_t)
P buildForm B
D buildForm PI
D type CONST like(formType_t)
D mode CONST like(formMode_t)
这允许调用者轻松创建用于传递给您的过程的变量。
您可能最终将模板放在其他包含的内容中,例如STDTYPES或APPTYPES。
答案 2 :(得分:1)
许多商店通过将parms放入复印本来解决这个问题。然后在原型(PR)D-spec行和过程接口(PI)行之后立即使用副本。