如何在 ILE RPG 中调用具有 return 值的过程指针的过程

How to call a procedure via Procedurepointer with return value in ILE RPG

有谁知道如何使用过程指针调用内部描述的子过程returning 值。

我正在阅读 ILE RPG 手册并卡在 %PADDR BIF 上,它允许我获取过程的地址。例如,当动态决定我想调用哪个过程时,我可以使用 if...then...else..endif 和 CALLP 来完成。但是有没有办法将 callp 从 if 结构中外部化?就像 .NET 中的委托一样,我可以在其中定义委托并将 function/sub 分配给控制结构中的调用。

我所知道的是如何定义 PROCPTR 以及如何在没有 return 值的情况下调用过程。但是在处理 return 值时我必须做什么。

下面是分配过程地址和调用过程本身的示例:

 H**************************************************************************
 H DEBUG DECEDIT('0,') DATEDIT(*DMY.) dftactgrp(*no)
 H*
 D**************************************************************************
 D*  Prototypes
 D*-------------------------------------------------------------------------
 D*            -------------------------------------------------------------
 D*            Returns String 1
 D*            -------------------------------------------------------------
 D GetStr1         pr            10a
 D
 D*            -------------------------------------------------------------
 D*            Returns String 2
 D*            -------------------------------------------------------------
 D GetStr2         pr            10a
 D
 D**************************************************************************
 D*  Definitions
 D*-------------------------------------------------------------------------
 D pPtrGetStr1     s               *   procptr
 D pPtrGetSTr2     s               *   procptr
 D string1         s             10a
 D string2         s             10a
 D
 C**************************************************************************
 C*  M A I N P R O G R A M 
 C**************************************************************************
 C
 C                   eval      pPtrGetStr1 = %paddr(GetStr1)
 C                   eval      pPtrGetStr2 = %paddr(GetStr2)
 C
 C                   eval      string1 = GetStr1()
 C                   eval      string2 = GetStr2()
 C
 C     string1       dsply
 C     string2       dsply
 C
 C                   move      *on           *inlr
 P**************************************************************************
 P*  P R O C E D U R E S
 P**************************************************************************
 P*            -------------------------------------------------------------
 P*            Returns String 1
 P*            -------------------------------------------------------------
 P GetStr1         b
 D GetStr1         pi            10a
 D result          s             10a
 C                   movel     'string1'     result
 C                   return    result
 P GetStr1         e
 P
 P*            -------------------------------------------------------------
 P*            Returns String 2
 P*            -------------------------------------------------------------
 P GetStr2         b
 D GetStr2         pi            10a
 D result          s             10a
 C                   movel     'string2'     result
 C                   return    result
 P GetStr2         e
 P************************************************************************** 

提前致谢

快到了:

您需要一个使用过程指针解析动态过程的原型。

dcl-s pDynamicProc      Pointer(*proc);                 // --2--
dcl-pr DynamicProc      Char(25) ExtProc(pDynamicProc); // --1--
  parm1                 Char(10);
  parm2                 Char(10);
end-pr;

...

// Before you call it you need to set the pointer
if (some condition) then;                 // --3--
  pDynamicProc = %paddr(Proc1);
else;
  pDynamicProc = %paddr(Proc2);
endif;

// Here is the call
MyVariable = DynamicProc(p1: p2);         // --4--

...

// ====================================================
// Procedure definitions
dcl-proc Proc1;
  dcl-pi *n Char(25);
    parm1       Char(10);
    parm2       Char(10);
  end-pi;

// Do something

end-proc;

// ====================================================
// Another procedure with the same procedure interface
dcl-proc Proc2;
  dcl-pi *n Char(25);
    parm1       Char(10);
    parm2       Char(10);
  end-pi;

// Do something else

end-proc;

这样您就不必搜索代码来确定发生了什么。 DynamicProc 是由过程指针 pDynamicProc 解析的过程。原型位于 // --1--ExtProc() 关键字指定过程指针而不是过程名称。指针定义在 // --2--。在使用 DynamicProc 调用过程之前,必须用过程地址填充指针。这发生在 // --3--。现在您可以像调用任何其他过程一样调用 DynamicProc(请参阅 // --4--)。

请注意,我没有 Proc1Proc2 的原型。除非我直接从模块外部调用它们,否则我不需要它们。顺便说一句,根据之前的问题,您发布的版本支持省略内部程序的原型。你应该停止编码固定格式的角色扮演游戏。那些跟随你维护你的代码的人会感谢你。