读取IBM文档,我对如何正确编写程序/过程输入点有些困惑。
特别是阅读此https://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c092508410.htm
我看到:
在这里带有匹配名称的原型必须先于过程 源
中的接口
我读:
如果您不指定周期序列过程的原型,则使用 *n作为过程接口的名称
所以我以这种方式对新程序进行编码:
CTL-OPT ...
DCL-PI *N;
P1 CHAR(2);
P2 CHAR(2) CONST;
P3 CHAR(2) CONST;
P4 CHAR(1) CONST;
P5 PACKED(7) CONST;
P6 POINTER;
P7 INT(5);
END-PI;
...
它编译并运行良好。
所以我要问的是,何时,为什么要在接口之前指定原型?
您问题的简短答案始终为RPG4程序创建原型。它可能是可选的,但您可能需要它。
我已经开始使用线性主过程进行程序而不是周期主过程。您可以通过在程序的头部加入ctl-opt Main(procname)
来做到这一点。我还将原型放在单独的源文件中。这样,我可以轻松地将它们包括在/copy
指令中,该指令具有在程序顶部收集外部程序和服务程序依赖项的副作用。我更喜欢将所有原型放在单独的源文件中,该文件与程序源相同。或用于服务程序,我将其命名与服务程序相同。但是我工作过的某些地方会在原型的末尾放置后缀,并将其与程序或模块源一起存储在同一服务程序中。v7.1的好处是,您不必为内部程序定义原型,而只需将其导出的原型定义。在程序级别上,这是主要过程,虽然不需要这是必需的,但我总是在其本身的来源中创建该原型,因为您从不真正知道您是否要在某个时候从其他地方调用该程序将来。另外,尽管您不需要将原型包含在程序本身中,但是这样做是验证原型是否有效的好方法。
所以,详细介绍并查看7.1>中的更改(对于完整的免费表格语法),我发现了这一点:
7.1中有什么新功能?
如果其他RPG模块未调用程序或过程,则是 可选以指定原型。可能会省略原型 以下程序和程序类型:仅 打算用作退出程序或命令处理 命令程序的程序,仅旨在调用的程序 从不同的编程语言中一个未导出的程序 从模块中,一个从模块导出的过程,但仅 打算从不同的编程语言中调用。
值得一读所有"新的"页面!
必须手动打开和关闭文件...
文件将自动为RPG模块中定义的所有文件打开,除非指定了USROPN关键字。这适用于任何类型的模块中的全局文件,以及子过程中的本地文件。
有所不同的是何时或是否自动关闭文件,具体取决于文件的声明地点。在激活组结束之前,在NOMAIN或线性主模块中的子过程或全局文件中的静态文件永远不会自动关闭。子过程结束时子过程中的自动文件将关闭,并且Cycle Main模块中的全局文件根据RPG周期关闭。