如何在 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--
)。
请注意,我没有 Proc1
和 Proc2
的原型。除非我直接从模块外部调用它们,否则我不需要它们。顺便说一句,根据之前的问题,您发布的版本支持省略内部程序的原型。你应该停止编码固定格式的角色扮演游戏。那些跟随你维护你的代码的人会感谢你。
有谁知道如何使用过程指针调用内部描述的子过程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--
)。
请注意,我没有 Proc1
和 Proc2
的原型。除非我直接从模块外部调用它们,否则我不需要它们。顺便说一句,根据之前的问题,您发布的版本支持省略内部程序的原型。你应该停止编码固定格式的角色扮演游戏。那些跟随你维护你的代码的人会感谢你。