免费注册 查看新帖 |

Chinaunix

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

请问:call,callp,callb 有什么区别? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-02 10:46 |只看该作者 |倒序浏览
我初步是这样理解的,不知道对不?欢迎大家指正。
                                   
call      被调用的程序, 需要编译。
callb    被调用的程序, 不需要编译?(因为编译是总是不成功,不知道应该怎样用?)
callp    被调用的程序,是写在程序内部,在D区定义的。

论坛徽章:
0
2 [报告]
发表于 2006-06-02 11:01 |只看该作者
个人理解仅表达个人理解部分,有啥不对的地方,希望前辈们指正)

CALL能应用于RPG版本的程序和RPGLE版本的,而CALLB,CALLP应用于RPGLE版本.

call      被调用的程序, 需要编译。这个应该大家都用的很多了,没啥好说的,就是这个意思了.

CallB比Call处理效果应该要快一点,因为它调用的是已经静态绑定了的对象.CallP已经不怎么使用了.

下面是引用了一篇文章的内容,供大家参考一下:

((CallP是用来代替CallB和Call的。当你使用CallP时,你必须在D规范表中定义一个过程原型。在原型声明中,你可以定义静态或者动态绑定的调用连接。关键字EXTPROC被用来指定静态调用连接,而EXTPGM被用来指定动态调用连接。(缺省是静态绑定).因此当进行RPG IV编程时,建议全部使用CallP方式.))

CallP和CallB,Call的主要区别在于CallP提供更好的参数类型检查。它同时也提供更丰富的功能如使用值传递或者常量传递参数。

通过定义一个相应的原型,可以很容易地用CallP去调用当前使用Call或者CallB调用方式的程序。只需检查*ENTRY PLIST中定义的变量的类型并定义一个具有跟它对应类型的参数的原型。需要注意的是CallP的类型检查比Call更严格,所以你定义参数的时候要非常小心。 例如,如果你想传递变长的字符型或者数组型参数就需要指定OPTIONS(*VARSIZE)选项。如果某些参数是可选的,你需要指定OPTIONS(*OMIT)或者OPTIONS(*NOPASS)选项。

你不需要对被调用的程序作任何改变来使得它可以被用CallP方式调用。如果你想利用新的语言特性,你可以为该程序定义一个过程接口来代替*ENTRY PLIST。 这样当为它增加新功能时,你可以使用子过程来进行编程。

当给模块定义原型时,我们建议把该模块的原形定义放在一个/COPY成员里然后在模块源代码其它所有调用该模块的模块的源代码里包含这个/COPY成员。

论坛徽章:
0
3 [报告]
发表于 2006-06-02 11:22 |只看该作者
这个帖子让我想起一个试题:

背景:那时刚学了3个月RPG时,自我感觉还是不错的,飘飘然哈,但是看到下面的试题后,整个人一下懵了,每踢5分,
当时做下来做对了7道题,~~~~~~~~~~~~~

1:function key CA 与 CF 的区别;
2:dataQ 与 data area 的区别;
3:chain 与 reade 的区别;
4:callb 与 callp 的区别
5:一个RPG程序中打开文件的最大数是多少?(RPG和RPGLE)
6:RPG程序中一个字符型变量的长度是多少?
7:数字型数组的求和操作符是什么?
8:使用RPG程序,C表中非要写代码吗?
9:reset和CLEAR的用法和区别?
10: *cat, *tcat, *bcat区别?
11:RPG程序最多能定义多少个SUBFILE?自己最多有做个多少级的SUBFILE文件?
12:RPG程序的流程是什么?
13:自己参与过哪些项目?如果有参与,自己是担当什么角色?
14:  RPG  代表什么意思 ?
15:  如何读取一个文件的最后一条记录 (两个操作代码)
16:  SKIPA , SKIPB , SPAECE 的区别 ?
17:  在 CL 中如何获得用户名 ?
18:RPG中,最大值和最小值是什么?
19:RPG程序和CLP程序区别在哪?
20:RPGLE的内置函数的优点,起列举6个加以说明.

论坛徽章:
0
4 [报告]
发表于 2006-06-02 12:23 |只看该作者
例如:我要用callB 调用 test2 (已经编译好的),但是 编译是提示 DFTACTGRP (*yes) 有问题。
我应该怎样改呢?
                     Create Bound RPG Program (CRTBNDRPG)                  
                                                                           
Type choices, press Enter.                                                  
                                                                           
Program  . . . . . . . . . . . . > TEST1         Name, *CTLSPEC            
  Library  . . . . . . . . . . . >   WLHLIB      Name, *CURLIB              
Source file  . . . . . . . . . . > WLHPGM        Name, QRPGLESRC            
  Library  . . . . . . . . . . . >   WLHLIB      Name, *LIBL, *CURLIB      
Source member  . . . . . . . . . > TEST1         Name, *PGM                 
Generation severity level  . . .   10            0-20                       
Text 'description' . . . . . . .   *SRCMBRTXT                              
                                                                           
Default activation group . . . . > *NO           *YES, *NO                  
Activation group . . . . . . . .   QILE          Name, QILE, *NEW, *CALLER  
Binding directory  . . . . . . .   *NONE         Name, *NONE               
  Library  . . . . . . . . . . .                 Name, *LIBL, *CURLIB...   
               + for more values

论坛徽章:
0
5 [报告]
发表于 2006-06-02 12:31 |只看该作者
原帖由 fairyboy 于 2006-6-2 11:22 发表
这个帖子让我想起一个试题:

背景:那时刚学了3个月RPG时,自我感觉还是不错的,飘飘然哈,但是看到下面的试题后,整个人一下懵了,每踢5分,
当时做下来做对了7道题,~~~~~~~~~~~~~

1:function key CA 与 CF 的区别 ...

能对七个,了不起。 好有几题,我不知道他在问什么。
12:RPG程序的流程是什么?
18:RPG中,最大值和最小值是什么?


论坛徽章:
0
6 [报告]
发表于 2006-06-02 22:34 |只看该作者
原帖由 chinagirlwang 于 2006-6-2 12:23 发表
例如:我要用callB 调用 test2 (已经编译好的),但是 编译是提示 DFTACTGRP (*yes) 有问题。
我应该怎样改呢?
                     Create Bound RPG Program (CRTBNDRPG)                  
              ...


DFTACTGRP (*yes)改成DFTACTGRP (*NO)

论坛徽章:
0
7 [报告]
发表于 2006-06-05 09:07 |只看该作者
callB是静态调用,只能用在RPGLE中
而RPGLE程序,DFTACTGRP 必须为 (*NO)
这里有个活动组的概念,RPGIII的程序都编译到一个称为“默认活动组”中
而RPGLE必须指定一个活动组名称,相关的RPGLE的活动组的名称应该相同

活动组是作业的子结构,它由分配来运行一个或多个ILE或OPM程序的系统资源组成(例如,存储空间,落实定义,及打开文件)。活动组可以使几个ILE程序在同一个作业中运行而彼此互不影响(例如,落实控制及复盖)。它的基本思想是在同一活动组内活动的所有程序组成一个协作的应用程序。
应该在程序建立时指定它在哪个活动中运行。活动组是在程序目标建立时由参数ACTGRP的指定值决定的。(OPM程序总是在默认活动组中运行的。不可以修改他们的活动组)。一旦ILE程序(目标类型*PGM)被激活,他们就一直保持活动状态直到活动组被删除。

论坛徽章:
0
8 [报告]
发表于 2006-07-27 14:05 |只看该作者
现在才明白,在使用 callb   test2 时,test2程序必须是已经编译为 module并必须指定 binding direatory......

论坛徽章:
0
9 [报告]
发表于 2006-08-16 17:22 |只看该作者

区别在哪里啊,我刚学了一个月啊,那位前辈知道啊!!

原帖由 fairyboy 于 2006-6-2 11:22 发表
这个帖子让我想起一个试题:

背景:那时刚学了3个月RPG时,自我感觉还是不错的,飘飘然哈,但是看到下面的试题后,整个人一下懵了,每踢5分,
当时做下来做对了7道题,~~~~~~~~~~~~~

1:function key CA 与 CF 的区别 ...



谢谢告诉我答案???谢谢!谢谢!各位!!!

论坛徽章:
0
10 [报告]
发表于 2006-08-17 22:20 |只看该作者
CALL 是动态调用------所谓动态调用,被调用的程序代码不在调用程序里, 调用程序执行时,才把被调用程序从硬盘读进内存, 这里存在一个Page Fault问题.

CALLB,CALLP都是静态调用.---所谓静态调用,当编译时,所有的代码都已经编译在一个程序里了.执行效率会更高.


CALLB调用是MODULE---- 用选择15就可以编译成MODULE,最后用CRTPGM把这些MODULE编在一个程序里
CALLP调用的Procedure----Procedure提供了更加丰富的入口参数和调用形式功能, 也可以独立编译成module(用nomain), 也可以与主程序源代码放在一起.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP