在RPGLE程序中添加新的条目参数

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)

使用此参数的代码中唯一的其他区域如上所示.在这里,我确保在引用参数之前,检查参数是否已通过.

我测试过,这很好用.但是,考虑到应用程序的重要性,仍然想到寻求专家的帮助.

欢迎任何有关此的指导/建议.

Cha*_*les 5

你有等待发生的内存损坏错误......

如果您尝试在没有最后一个参数的情况下调用该程序并且它似乎已经有效,那么您很幸运的是内存区域没有被使用...因此是零并且您%Addr(E_Grp) <> *NULL按预期工作.

为了进行比较,%Addr(E_Grp) <> *NULL您的调用程序必须传递该*OMIT参数的特殊值.显然,这将需要更改所有调用程序.

你想要的是不必更改调用程序,因此在被调用程序中你需要的是参数*NOPASS.

您应该转换为被调用程序以使用PR/PI而不是*ENTRY PLIST.然后,您可以将最后一个参数标记为options(*NOPASS *OMIT)

然后在被调用的程序中,您可以检查

  1. 如果参数已通过
  2. 如果传递的parm为NULL(*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)

  • 即使您使用*ENTRY PLIST,也可以使用%PARMS检查参数的数量.编辑:但如果您有*ENTRY PLIST,则无法使用%PARMNUM,因此切换为使用PI将是最佳选择. (2认同)