the*_*112 1 rpgle ibm-midrange
我正在修改这个非常关键的RPGLE程序,其中的更改涉及向其添加新的入口参数.
*entry plist
parm ecorp corp
parm edivi divi
parm eplvl parent lv
parm ewrsc wc rscd
parm eplnt plnt
parm eclvl child lv
parm emord ord
parm easst asst
parm emrwk mrwk#
parm eseqn seq #
parm easeq alt seq #
parm epprd alt seq #
parm eotst alt seq #
parm ewpqt alt seq #
parm ecmpc alt seq #
parm ewurs alt seq #
parm emurs alt seq #
parm epcdt alt seq #
parm E_Optn option
parm eeoj end of job
parm E_Pgm program
parm E_GRP MO GROUP
Run Code Online (Sandbox Code Playgroud)
程序入口参数列表如上所述,但我现在添加的最后一个参数除外.该程序工作正常.但我有点担心的是,这是否会以某种方式影响调用此程序的其他区域.即调用者程序,其中未传递最后一个输入参数.
这个新的入口参数将仅从另一个程序传递,该程序是更改的一部分.还有很多其他程序会调用程序传递与之前相同的参数列表.
If (%Addr(E_Grp) <> *NULL);
Chain (E_Grp:EWURS:ssmurs) MFMPP00;
If %Found();
MchAllotted = *On;
Leave;
EndIf;
EndIf;
Run Code Online (Sandbox Code Playgroud)
使用此参数的代码中唯一的其他区域如上所示.在这里,我确保在引用参数之前,检查参数是否已通过.
我测试过,这很好用.但是,考虑到应用程序的重要性,仍然想到寻求专家的帮助.
欢迎任何有关此的指导/建议.
你有等待发生的内存损坏错误......
如果您尝试在没有最后一个参数的情况下调用该程序并且它似乎已经有效,那么您很幸运的是内存区域没有被使用...因此是零并且您%Addr(E_Grp) <> *NULL
按预期工作.
为了进行比较,%Addr(E_Grp) <> *NULL
您的调用程序必须传递该*OMIT
参数的特殊值.显然,这将需要更改所有调用程序.
你想要的是不必更改调用程序,因此在被调用程序中你需要的是参数*NOPASS
.
您应该转换为被调用程序以使用PR/PI而不是*ENTRY PLIST.然后,您可以将最后一个参数标记为options(*NOPASS *OMIT)
然后在被调用的程序中,您可以检查
码
// check if the parm was passed
if %parms() > = %parmnum(E_GRP);
// check if passed parm is not NULL
if %Addr(E_Grp) <> *NULL;
//ok to use E_Grp
Chain (E_Grp:EWURS:ssmurs) MFMPP00;
If %Found();
MchAllotted = *On;
Leave;
endif;
endif;
endif;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
258 次 |
最近记录: |