FMT H HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++
*************** Beginning of data ***************************
0001.00 H DFTACTGRP(*NO)
0002.00
0003.00 DProcAdd PR 10P 2 ExtProc('ProcAdd') //求和,真实的Proc, 要有PI定义
0004.00 D Add1 10P 2
0005.00 D Add2 10P 2
0006.00 DProcSub PR 10P 2 ExtProc('ProcSub') //求差,真实的Proc, 要有PI定义
0007.00 D Sub1 10P 2
0008.00 D Sub2 10P 2
0009.00 DProcActual PR 10P 2 ExtProc(ProcToCall) //通过指针指向某一不确定的Proc,只有PR. 参数要跟真正调用的Proc一致
0010.00 D input1 10P 2
0011.00 D input2 10P 2
0012.00 Dp1 S 10p 2 inz(209.8)
0013.00 Dp2 S 10p 2 inz(19.2)
0014.00 DProcToCall S * ProcPtr //procedure pointer, 要有ProcPtr关键字修饰
0015.00 DReply S 1A Inz('A') //接收Dsply返回的值,很好的用法
0016.00
0017.00 /free
0018.00 // 1st. don't use procedure pointer, call proc directly
0019.00 //Dsply ProcAdd(p1: p2); //这个很好理解, 直接调用不同Proc
0020.00 //Eval p1=100.2;
0021.00 //Eval p2=20.3;
0022.00 //Dsply ProcSub(p1: p2);
0023.00
0024.00 // 2nd. use procedure pointer
0025.00 Dsply 'Do you want Add (A) or Sub (S)?' '' Reply;
0026.00 if Reply='A' or Reply='a';
0027.00 ProcToCall= %Paddr('ProcAdd'); //将proc pointer指向到ProcAdd subprocedure
0028.00 elseif Reply='S' or Reply='s';
0029.00 ProcToCall= %Paddr('ProcSub'); //将proc pointer指向到ProcAdd subprocedure
0030.00 else;
0031.00 Dsply 'Reply error. Pgm ended.';
0032.00 Eval *inlr=*on;
0033.00 Return;
0034.00 endif;
0035.00 Dsply ProcActual(p1: p2); //这是一个procedure外壳, 通过procedure pointer指向某一确定subprocedure
0036.00
0037.00 Eval *inlr=*on;
0038.00 Return;
0039.00 /end-free
0040.00
0041.00 PProcAdd B
0042.00 DProcAdd PI 10P 2
0043.00 D Add1 10P 2
0044.00 D Add2 10P 2
0045.00 /free
0046.00 Add1=Add1+Add2;
0047.00 Return Add1;
0048.00 /end-free
0049.00 PProcAdd E
0050.00
0051.00 PProcSub B
0052.00 DProcSub PI 10P 2
0053.00 D Sub1 10P 2
0054.00 D Sub2 10P 2
0055.00 /free
0056.00 Sub1=Sub1-Sub2;
0057.00 Return Sub1;
0058.00 /end-free
0059.00 PProcSub E
****************** End of data ***************
1. 通过dsply的返回值来选择procedure pointer指向哪个subprocedure
2. 在main procedure中使用procedure pointer, 必定需要空壳PR, 空壳PR的ExtProc用procedure pointer
空壳PR的定义格式要跟最终真正调用的某一确定subprocedure的格式定义要保持一致, 否则纵然指针指过去, 参数传时是会出错的.
从另一个角度来看, procedure pointer可能指向的那几个subprocedure的定义格式应该也是相同的, 只是在各个subprocedure内部处理不同.