我的程序,PKGDAYMONR 有控制选项:

ctl-opt Main( CheckDailyPackages ) 

CheckDailyPackages 程序具有以下 PI:

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

如您所见,ExtPgm 参数不是程序的名称。其实就是模板源里过来的,忘记改了。尽管 ExtPgm 中的名称错误,但程序运行没有问题。

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

RNF3573: A parameter is required for the EXTPGM keyword when the procedure name is longer than 10.

如果我从过程接口(interface)中完全删除 ExtPgm,它也会提示:

RNF3834: EXTPGM must be specified on the prototype for the MAIN() procedure.

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

操作系统级别:IBM i 7.2

请您参考如下方法:

可能值得作为服务提供商的缺陷追究;大概对于大多数人来说,这将是 IBM 而不是第三方,因为他们无论如何都必须联系 IBM,因为他们认为问题显然出在他们的编译器上。除此之外,作为我的“答案”,我提供一些想法:

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

FWiW:是否测试了该自由格式代码的固定格式等效项,以查看是否产生了相同或不同的错误?以下源代码当前包含以“PGMNAME”作为参数的 EXTPGM 规范 [即提供任何 10 字节命名 的虚假值来请求编译器,就像在 OP 的场景中所做的那样,只是为了成功编译],但可以与其他变体一起编译更改源代码,模仿对自由形式变体所做的操作,以测试相同\一致的验证和错误是否会产生影响:
- 只是编码了 EXTPGM 关键字(没有参数);是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 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!