免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5827 | 回复: 8
打印 上一主题 下一主题

RPGLE传参那些事儿 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-24 14:40 |只看该作者 |倒序浏览
本帖最后由 niuhua77 于 2011-06-24 14:43 编辑

  1. 众所周知RPGLE有3种传参方式,分别是by reference, by value, by read-only reference
  2. 下面就这三种传参方式,结合red book来谈谈自己的理解。

  3. 一By reference
  4. RPGLE默认的传参方式就是by reference。用CALL/PLIST来调用程序就是典型的by reference方式。

  5. By reference原理:
  6. By reference方式实际上是把变量的指针传给被调用的程序,被调用的程序可以修改变量指针所指向的值,然后把变量的指针返回给调用者,这样调用者就可以使用被修改过的变量了。

  7. By reference有两点注意事项:
  8. 1.调用*PGM类型的程序,只能使用By reference(by read-only reference)。
  9. 2.调用external program call (EXTPGM)也只能用By reference(by read-only reference)。

  10. 二By value
  11. 对于使用原型定义的procedure(prototyped procedure),除了使用by reference外,还可以使用by value的方式传参。
  12. By value 顾名思义,是把变量值传递给被调用者,注意仅仅是变量所代表的值,而非变量本身。变量本身不发生任何变化。
  13. 实际上,用by value方式,被调用者也可以改变变量值,但是这个改变仅仅发生在被调用的程序范围内。即这种变化对于调用者来说,是不可见的,是透明的。

  14. By value实现原理:
  15. Red book并没有给出by value方式的实现原理(我没找到,anyone knows?),但是我根据by read-only reference方式实现的原理,猜测by value的原理,大概应该如下:
  16. 当用by value传参数时,编译器会把这个参数拷贝到一个临时变量中,然后把这个临时变量的指针传递给被调用的程序。这样的话,无论被调用的程序对此参数做如何操作,都不会影响原来的参数值,因为他改变的仅仅是临时变量的值。所以用by value方式传参,不会改变原变量的值。

  17. By value的定义方法(key word:value):
  18. D function1        PR         
  19. D  parm1                   10a   value

  20. By value的优势有哪些呢?
  21. 1.它可以使用字符、数字常量和表达式作为参数传递。
  22. 2.它可以弱化数据类型的检查匹配。比如你定义个参数 5P 0,你传给它3S 1也是可以的。
  23. 3.你也可以像by reference那样用变量作为参数传递,但是从调用者的角度来看,这个变量值是不会被改变的(参见by value原理)

  24. 三 by read-only reference
  25. 第三种方式比较有意思,因为他是by reference和by value的合体,兼有两种方式的优点。
  26. 首先,by read-only reference从字面上来看,它是也是by reference方式,所以适用by reference的地方,也都适用by read-only reference。只不过它前面加了一个限定词read-only,即只读,却不能改变,那么它又具备了by value的特点,这样by value的各种优势他也具备了。

  27. By read-only reference的定义方法(key word:const):
  28. D function2        PR         
  29. D  parm2                   10a   const

  30. By read-only reference的注意事项:
  31. 用by read-only reference传参,要确保这个参数值在被调用的程序中不会被修改,即这个参数是input parameter(有点类似于F-spec定义文件的打开方式,by read-only reference必须用IF的方式打开,不能用UF的方式打开,即read-only parameter不能被修改)。如果被调用的程序会修改input parameter的值,那么放心好了,程序也不会出现任何问题。因为编译就没法通过……

  32. By read-only reference的优点:
  33. 参见by value

  34. By read-only reference的原理:
  35. 参见by value

  36. 四 如何合理的选择各种参数传递的方式

  37. 以上三种传参方式各有各的好处。有的情况下3种方式都可以使用,有的情况下只能使用特定的某种方式。从下表可以看出:(文字有点啰嗦,看图一目了然)
  38. 1.调用program只能用by reference的方式。(CALL /CALLP EXTPGM)
  39. 2调用没有定义原型的procedure,也只能用by reference的方式。(CALLB)
  40. 3.by value只能用于调用procedure。(CALLP EXTPROC/EXPRESSION)
  41. 4 by reference 适用于所有的CALL 方式。
  42. 5有定义原型的procedure,三种传参方式都适用。

  43. 至于by read-only reference的使用,如果必须用by reference的方式传参,并且你能保证被调用的程序不会更改这个参数值,那么就可以使用by read-only reference了。
  44. 关于by value 和by read-only reference应该选那一个,按照red book的说法:
  45. 1.如果参数是数字型或者指针型的,那么使用by value在效率上会稍稍高一点。
  46. 2.其他的情况,请选择by read-only reference。
复制代码

callcallbcallp extpgmcallp extprocexpression
by referenceO    O         O         O        O
by value         O        O

论坛徽章:
0
2 [报告]
发表于 2011-06-24 15:57 |只看该作者
有没有考虑ile环境下的开发,比如原型定义的不同语言modules之间的调用传参?

论坛徽章:
0
3 [报告]
发表于 2011-06-24 16:28 |只看该作者
回复 2# passthru


   

ILE平台下,不同的language之间调用传参,要注意相互之间传参方式的匹配。


rpglec来说,C默认的方式是by value的,那么rpglec函数的时候,原型定义中就要指定用by valueby read-only reference)方式。如果C函数的参数是指针,那么原型定义中就要用by reference的方式.


我的理解是这样的。

论坛徽章:
0
4 [报告]
发表于 2011-06-24 17:03 |只看该作者
up,good

论坛徽章:
0
5 [报告]
发表于 2011-06-24 23:04 |只看该作者
回复 4# first_come


    thanks for supporting

论坛徽章:
0
6 [报告]
发表于 2011-06-25 00:17 |只看该作者
很少注意总结,学习学校

论坛徽章:
0
7 [报告]
发表于 2011-06-25 23:15 |只看该作者
回复 6# insmile


    我也是怕自己时间长就忘了,呵呵

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-05 06:20:00
8 [报告]
发表于 2011-06-27 17:54 |只看该作者
原来是你呀,看你的马甲才知道,先顶!

论坛徽章:
0
9 [报告]
发表于 2011-06-27 19:24 |只看该作者
回复 8# junlee1986


    我就这一个号,没马甲
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP