为什么我必须为主过程指定ExtPgm参数?

时间:2015-04-16 19:13:12

标签: rpgle

我的程序PKGDAYMONR有控制选项:

ctl-opt Main( CheckDailyPackages )

CheckDailyPackages程序具有以下PI:

dcl-pi *n ExtPgm( 'PGMNAME' );

如您所见,ExtPgm参数不是程序的名称。事实上,它是模板源中出现的,我忘了改变它。尽管ExtPgm中的名称错误,但程序运行没有问题。

如果删除该参数并将关键字保留为ExtPgm,我会收到以下消息:

  

RNF3573:当EXTPGM关键字需要参数时   程序名称长于10。

如果我完全从程序界面中删除ExtPgm,它也会抱怨:

  

RNF3834:必须在MAIN()的原型上指定EXTPGM   过程

那么,为什么我必须指定一个参数,如果它与我输入的值无关?

O / S级别:IBM i 7.2

3 个答案:

答案 0 :(得分:4)

可能值得追求服务提供商的缺陷;可能对大多数人而言,那将是IBM而不是第三方,因为无论如何他们都必须联系IBM,因为他们的编译器显然已经发现了问题。除此之外,作为我的“答案”,我提出了一些想法:

IMO,并且与OP明显一致,在给定方案中命名ExtPgm似乎毫无意义。我认为编译器困惑,同时试图强制执行隐式生成的Prototype 的验证中的一些要求,对于仅提供过程接口的linear-main;即强制执行适用于显式原型的要求,但在给定方案中可以忽略的要求[因此不再是要求]。我建议虽然RNF3573似乎适合诊断显式原型的EXTPGM规格,但IMO认为同样的效果是不合适的[即对于由编译器生成的隐式原型,不应执行验证。

FWiW:是否测试了自由格式代码的固定格式等效项,以查看相同或不同的错误是否有影响?以下源代码目前包含EXTPGM规范,其中'PGMNAME'作为参数[即提供 10字节命名的任何虚假值以支持编译器,就像在OP的场景中一样,只是为了成功编译],但可以使用其他变体进行编译更改源,模仿自由格式变体,测试相同的\一致验证和错误是否有效:
- 只需EXTPGM关键字编码(w / out参数);是RNF3573的效果?
- 可以省略EXTPGM关键字;是RNF3834的效果?
- 完全删除D-spec(如果没有定义参数); ¿这不是OP中提到的变化之一,因此......效果如何?

    H MAIN(CheckDailyPackages)
     *--------------------------------------------------
     * Program name: CheckDailyPackages (PGMNAME)
     *-------------------------------------------------- 
    P CheckDailyPackages...
    P                 B
    D                 PI                  EXTPGM('PGMNAME')
      /free
       // Work is done here      
      /end-free
    P CheckDailyPackages...
    P                 E

答案 1 :(得分:1)

EXTPGM关键字用于定义要原型化的程序的外部名称。如果你提到EXTPGM,那么程序将被动态调用。

让我们举一个例子来解释你的问题。

PGMA

D cmdExc          PR                  ExtPgm('QSYS/QCMDEXC')
D                              200A   const
D                               15P05 const
c                   callp     cmdExc('CLRPFM LIB1/PF1':200)
C                   Eval      *INLR = *ON 

在上面的示例中,CmdExc用于动态调用QSYS / QCMDEXC。

当我们使用与EXTPGM参数相同的程序名时,当从其他程序或程序调用时,它充当程序的入口点。

但是在任何情况下,当我们提到任何名称作为样本参数时,EXTPGM不会在编译时给出任何错误,但是它会在运行时尝试在运行时解析名称时给出错误。

答案 2 :(得分:1)

我收到了IBM的回复,基本上Biswa正在做些什么,但我(根据我的意见)对答案一无所知。

基本上,对于长主程序名称,EXTPGM是必需的,以便支持递归程序调用

这是我从IBM收到的回复,解释了该方案的原因:

  

错误的EXTPGM只有在有人打电话时才有意义   模块内的程序(程序)   当编译器处理过程接口时,它不知道
  是否可能有稍后出现在模块中的呼叫。