在Prototype和Procedure Interface之间共享定义

时间:2014-02-19 22:18:33

标签: rpgle

我开始使用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

感谢阅读。

3 个答案:

答案 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)行之后立即使用副本。