Chinaunix首页 | 论坛 | 博客
  • 博客访问: 345620
  • 博文数量: 90
  • 博客积分: 847
  • 博客等级: 准尉
  • 技术积分: 1373
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-02 10:54
个人简介

跌打滚爬中的小菜鸟...

文章分类

全部博文(90)

文章存档

2015年(5)

2013年(47)

2012年(38)

我的朋友

分类: 其他UNIX

2013-09-21 22:57:27

先上source  RPG25
 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内部处理不同.
阅读(2156) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~