我的程序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
答案 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只有在有人打电话时才有意义 模块内的程序(程序) 当编译器处理过程接口时,它不知道
是否可能有稍后出现在模块中的呼叫。