RPG编程同C语言编程的比较.docx
《RPG编程同C语言编程的比较.docx》由会员分享,可在线阅读,更多相关《RPG编程同C语言编程的比较.docx(37页珍藏版)》请在冰点文库上搜索。
RPG编程同C语言编程的比较
用法
ilerpg例子
变量声明
1、整数(i(整数)、b(二进制)、s(区位十进制)、p(压缩十进制))
i(整数)只可为3、5、10、20个字节长。
dpos1s5i0inz(*zero)
dpos2s10i0inz(*zero)
dpos3s3i0inz(*zero)
dpos4s20i0inz(*zero)
注意
s(区位十进制)
dpos5s16s0inz(*zero)
2、浮点数
只能定义为4字节和8字节
df1s4finz(*zero)
df2s8finz(*zero)
cevalf2=121212.12121212
cf2dsply
cevalf1=121212.12121212
cf1dsply
注意在小数点位数必须为blank。
8字节相当于double
dsply+1.212121212121200e+005
4字节相当于float
dsply+1.2121212e+05
3、字符串
das30ainz(*blank)
a单字节或多字节
n指示符,单字节
4、数组
这里只说明运行时数组
darrays2s0dim(12)
引用array(下标),下标从1开始。
dcharrs5adim(12)
5、基指针
基指针必须为4字节,且必须与4字节边界对齐。
6、结构
DParmDSDS1024
DSFld150
DSFld2200
D……
C*ENTRYPList
CParmParmDS
C*这是我们经常使用的一种结构定义方式和使用方式,这种用于传递入口参数的数据结构,一定不能使用INZ关键字。
C*但是,如果该结构不是作为程序入口参数或是作为下级调用的接口参数,一般要在工程中约定使用INZ关键字。
INZ关键字会让系统在程序被激活时,自动按结
C*构各子字段的类型自动初始化,否则上述结构中SFld1字段的值将是一个非法的空格值而不是数字零。
Dmystruds
Dname20a
Dage3s0
Dmemo44a
Daddr120a
Dtel12132a
Dtel23342a
或
Dmystruds68
Dname20a
Dage3s0
Dmemo44a
Daddr20aoverlay(memo:
1)
Dtel112aoverlay(memo:
21)
Dtel212aoverlay(memo:
33)
或
Dmystruds
Dname20a
Dage3s0
Dmemo44a
Daddr20aoverlay(memo)
Dtel112aoverlay(memo:
*next)
Dtel212aoverlay(memo:
*next)
Dother12a
多重数据结构及使用
Dmystrudsoccurs(10)inz
Dname20a
Dage3s0
Dmemo44a
Daddr20aoverlay(memo)
Dtel112aoverlay(memo:
*next)
Dtel212aoverlay(memo:
*next)
Dother12a
Dcnts2s0inz(*zero)
C*给第一个mystru赋值
C1occurmystru
Cevalname='高殿华'
Cevalage=30
Cevaladdr='河北省吴桥县'
Cevaltel1=''
Cevaltel2=''
Cevalother='12121212'
C*给第二个mystru赋值
C2occurmystru
C*等同于
Ceval%occur(mystru)=2
Cevalname='高殿华'
Cevalage=30
Cevaladdr='河北省吴桥县1111'
Cevaltel1=''
Cevaltel2=''
Cevalother='12121212'
C*依次访问每个数组元素
Cforcnt=1to2
Ccntoccurmystru
Caddrdsply
Cendfor
外部描述数据结构
DDSNameEDSEXTNAME(FileName)INZ
Extname(filename:
{fmtname})关键字用来引用filename中的记录格式,如未制定记录格式名,则默认第一个记录格式名。
文件状态数据结构
FFileNameCFEWORKSTNINFDS(FileDS)
DFileDSDS
DFileSt*STATUS
数据域
数据类型包括*CHAR,*DEC和*LGL三种。
如果指定因子2,则它必须包含正在引用的OS/400数据区。
若未指定因子2,则将结果字段用作数据区名称。
结果字段必须包含字段、数据结构、数据结构子字段或数据区数据结构。
这与为检索因子2中指定数据区中的数据并将数据写至此数据区,而与IN和OUT操作一起使用的名称同名。
在结果字段中指定数据区数据结构时,VisualAgeRPG应用程序在程序开始时检索数据区中的数据,并在程序结束时将数据写至数据区。
1》本地数据域*LDA
2》程序初始化参数数据域*PDA
3》外部描述数据域
例子1、
Dst_bufds60inz
Dname30
Daddr30
C*DTAARADEFINEdataareast_buf
C*锁定数据区dataare,读取信息到st_buf中,并显示,然后赋于新值
C*LOCKINst_buf
CnameDSPLY
CaddrDSPLY
Cevalname='gaodianhua
Cevaladdr='wuqiao'
COUTst_buf
CUNLOCKst_buf
CEVAL*INLR='1'
CRETURN
例子2:
DINFOS60A
C*数据区名称为:
dataarea
C*DTAARADEFINEdataareaINFO
C*锁定数据区,读取信息到INFO中,并显示,然后赋值于‘GAODIANHUA’
C*LOCKININFO
CINFODSPLY
CEVALINFO='GAODIANHUA
COUTINFO
CUNLOCKINFO
CEVAL*INLR='1'
CRETURN
IN:
读数据区,当因子1是*LOCK时,则设置了读锁,不允许更新。
OUT:
写入数据区,当因子1是*LOCK时,写操作后数据区保持锁定状态,当因子1为BLANK时,数据区更新后解锁。
UNLOCK:
对IN或OUT锁定的数据区解锁.
7、常量
十六进制文字的格式是:
x'x1x2...xn'x'x1x2...xn'必须包含字符a-f、a-f和0-9。
日期文字的格式为d'xxxxxx',其中:
d指示文字是日期类型的
xxxxxx是有效日期,其格式为控制规范上指定的格式
xxxxxx包围在单引号(')中。
时间文字的格式为t'xxxxxx',其中:
t指示该文字是时间类型的
xxxxxx是有效时间,其格式为控制规范上指定的格式
xxxxxx包围在单引号(')中。
时间戳记文字的格式为z'yyyy-mm-dd-hh.mm.ss.mmmmmm',其中:
z指示该文字是时间戳记类型的
yyyy-mm-dd是有效日期(年-月-日)
hh.mm.ss.mmmmmm是有效时间(小时.分钟.秒.毫秒)
yyyy-mm-dd-hh.mm.ss.mmmmmm括在单引号中
毫秒是可选的,若未指定,则缺省为0
命名常量:
可以代const
dupperc'abcdefghijklmnopqrstuvwxyz'
dlowercconst('abcdefghijklmnopqrstuvwxyz')
象征常数:
*all'x..',*allg'k1k2',*allu'xxxxyyyy',*allx'x1..',*blank/*blanks,*hival,*loval,*null,*on/*off,*zero/*zeros
循环
dcounts3s0inz(*zero)
dsums5s0inz(*zero)
1.for
cforcount=0to100
cevalsum=sum+count
cendfor
csumdsply
ceval*inlr='1'
creturn
2.dow
cevalcount=0
cevalsum=0
cdowcount<=100
cevalsum=sum+count
cevalcount=count+1
cenddo
3.dou
cevalcount=0
cevalsum=0
cdoucount>100
cevalsum=sum+count
cevalcount=count+1
cenddo
csumdsply
中断
leave
进行下一次循环
iter
选择结构
cifnot(sum>=5049andcount>=100)
c10000dsply
celseifsum=5049
c10001dsply
celseifsum=5051
c10002dsply
celse
c10003dsply
c*实现了嵌套
cifsum=5050
c10004dsply
cifsum>5049
c10005dsply
celse
c10006dsply
cendif
celse
c10007dsply
cendif
c*实现了组选择
cselect
cwhensum=5051
c'hhhh'dsply
cwhensum=5050
c'oooo'dsply
cother
c'pppp'dsply
cendsl
跳转语句
goto
cgototag1
c…
ctag1tag
c….
逻辑运算
and
or
not
算数运算
+
-
*
/
%rem()/*例子见后面*/
关系运算
>
<
>=
<=
=
<>
**
函数及原型的概念
1、主过程
EXAM10的源码
Dvar1s10s0
Dvar2s10s0
Dresults15s0
C*entryplist
Cparmvar1
Cparmvar2
Cparmresult
Cevalresult=var1+var2
Ceval*inlr='1'
Creturn
主过程由F、D、I、C、O规范表组成,使用’*ENTRYPLIST’语句指定模块入口参数。
如果在控制表上没有标定NOMAIN关键字,模块入口参数还可以被指定为目标程序的入口参数,使用CALL或CALLB操作码来调用。
Dvar1s10s0
Dvar2s10s0
Dresults15s0
Cevalvar1=100
Cevalvar2=200
Ccall'EXAM10'
Cparmvar1
Cparmvar2
Cparmresult
Cresultdsply
Ceval*inlr='1'
Creturn
2、子过程
(1)、有返回值,在调用时当作函数使用
原型说明
库名:
hbrccu
文件:
exam
成员:
aaaa
Dresults10i0inz(*zero)
Das10i0
Dbs10i0
D*原型说明
Dfunctionpr10i0
Da10i0value
Db10i0value
Cevala=10
Cevalb=10
C*有返回值,当作函数使用
Cevalresult=function(a:
b)
Cresultdsply
CEVAL*INLR=*ON
CRETURN
库名:
hbrccu
文件:
exam
成员:
bbbb
Hnomain
D*原型说明(加粗部分为过程或函数的返回值说明,也可以没有返回值)
Dfunctionpr10i0
Da10i0value
Db10i0value
Dresults10i0
D*子过程接口的定义(加粗部分表明可以被外部程序调用)
PfunctionBexport
Dfunctionpi10i0
Da10i0value
Db10i0value
Cevalresult=a+b
Creturnresult
PfunctionE
开始编译:
CRTRPGMODMODULE(HBRCCU/FUNC1)SRCFILE(HBRCCU/EXAM)SRCMBR(BBBB)
CRTRPGMODMODULE(HBRCCU/MAIN)SRCFILE(HBRCCU/EXAM)SRCMBR(AAAA)
CRTPGMPGM(HBRCCU/FUNCTION)MODULE(HBRCCU/MAINHBRCCU/FUNC1)
编译完成。
(2)、没有返回值,使用CALLP调用(注意加粗部分的调用)
库名:
hbrccu
文件:
exam
成员:
aaaa
Dresults10i0inz(*zero)
Das10i0
Dbs10i0
Dfunctionpr
Da10i0value
Db10i0value
Dresult10i0
Cevala=10
Cevalb=10
Ccallpfunction(a:
b:
result)
Cresultdsply
CEVAL*INLR=*ON
CRETURN
库名:
hbrccu
文件:
exam
成员:
aaaa
Hnomain
Dfunctionpr
Da10i0value
Db10i0value
Dresult10i0
PfunctionBexport
Dfunctionpi
Da10i0value
Db10i0value
Dresult10i0
Cevalresult=a+b
Creturn
PfunctionE
运行function后显示20.
注意:
(1)在加粗斜体部分,如果改成如下:
Dresult10i0value
则表明是值传递,在function中调用改变不影响其外部的值。
运行后显示0.注意value是值传递。
(2)export表明定义的这个子过程可以被外部调用。
假如没有export关键字,在执行
CRTPGMPGM(HBRCCU/FUNCTION)MODULE(HBRCCU/MAINHBRCCU/FUNC1)
报错。
算数函数或操作码
1、add
cl0n01factor1+++++++opcode&extfactor2+++++++result++++++++len++d+hiloeq
c1addsumsum
csumdsply
c*相当于
cl0n01factor1+++++++opcode&extfactor2+++++++result++++++++len++d+hiloeq
cevalsum=sum+1
csumdsply
2、sub
csumsub1sum
csumdsply
c*相当于
cevalsum=sum-1
csumdsply
3、mult
c3mult2sum
csumdsply
c*相当于
cevalsum=3*2
csumdsply
4、div
c12div3sum
csumdsply
c*相当于
cevalsum=12/3
csumdsply
5、%rem()取余
cevalcount=%rem(13:
3)
ccountdsply
c*相当于
c14div3sum
cmvrcount
ccountdsply
c*注意:
mvr只能用在div操作码的后面,不能用在evalsum=14/3的后面,编译报错
6、move和movel
Move自右向左取值赋值给int,并右靠齐
Movel自左向右取值赋值给int,并左靠齐
Dchar1s1ainz(*blank)
Dints2s0inz(*zero)
Cevalchar1='1'
Cmovelchar1int
Cintdsply
Ceval*inlr='1'
Creturn
此时字符串实际长度小于数字长度,movel时,此时int显示
DSPLY10
Dchar1s1ainz(*blank)
Dints2s0inz(*zero)
Cevalchar1='1'
Cmovechar1int
Cintdsply
Ceval*inlr='1'
Creturn
此时字符串实际长度小于数字长度,move时,此时int显示
DSPLY1
Dchar1s2ainz(*blank)
Dints2s0inz(*zero)
Cevalchar1='12'
Cmovechar1int
Cintdsply
Ceval*inlr='1'
Creturn
此时字符串实际长度等于数字长度,movel和move时,此时int都显示
DSPLY12
Dchar1s3ainz(*blank)
Dints2s0inz(*zero)
Cevalchar1='123'
Cmovelchar1int
Cintdsply
Ceval*inlr='1'
Creturn
此时字符串实际长度大于数字长度,movel时,此时int显示
DSPLY12
move时,此时int显示
DSPLY23
当int向char移动时也遵循这个结果.
函数比较
一、字符函数
das30ainz(*blank)
dbs20ainz(*blank)
dcs50ainz(*blank)
1、字符串连接
cevala='gaodianhua'
cevalb='isagoodboy'
cevalc=a+b
ccdsply
c*c的值dsply为gaodianhuaisagoodboy
cevala=%trim(a)+%trimr(b)
cadsply
c*c的值dsply为gaodianhuaisagoodboy
2、扫描字符串
cevalpos=%scan('oo':
a:
1)
cifpos=0
c'notfound'dsply
celse
cposdsply
cendif
3、%check(comparator:
base{:
start}):
在base串中查找第一个不在comparator中存在的字符的位置,如果base中的所有字符均在comparator中存在,则返回0。
%checkr(comparator:
base{:
start}):
在base串中查找最后一个不在comparator中存在的字符的位置,如果base中的所有的字符均在comprator中存在,则返回0。
4、%SUBST(字符串:
开始位置{:
长度})返回自变量字符串的一部分。
它也可用作带EVAL操作码的赋值的结果
5、%STR(基指针{:
最大长度})(右边)
%STR(基指针:
最大长度)(左边)
%alloc(number)
Deallocptr1
%realloc(ptr:
number)
Number必须是不带小数的非浮点数。
%STR既可以用来获取以NULL结束的字符串(当在表达式的右边使用时,此函数返回第一个参数指向的数据,直至(但不包括)指定长度中找到的第一个空字符(x'00')。
可在字符表达式有效的位置处使用此内置函数。
在运行时,若在指定的长度中找不到NULL终止符,则不出错。
在此情况下,结果值的长度与指定的长度相同。
),又可以用来存储以NULL结束的字符串(当在表达式的左边使用时,%STR(ptr:
length)将表达式右边的值赋给指针指向的存储器,并在尾部添加以NULL结束的字节。
可指定的最大长度是65535。
这表示最多可使用右边的65534字节,因为必须为末尾的NULL终止符保留1个字节。
)。
对基指针操作,务必现分配空间或赋值一个已分配空间的地址。
Dptr1s*
Dbufs20abased(ptr2)
Cevalptr1=%alloc(20)
Ceval%str(ptr1:
20)=’gaodianhua’
Cevalptr2=%alloc(20)
Cevalbuf=’gaodianhua’
C*与下面的结果相同
Ceval%str(ptr2:
20)=’gaodianhua’
举例:
Dptr1s*
Dbufs20a
Cevalptr1=%alloc(20)
Ceval%str(ptr1:
20)='gaodianhuaisagoodboy'
Cevalbuf=%str(ptr1:
20)
C*或evalbuf=%str(ptr1)
Cbufdsply
Cdeallocptr1
Ceval*inlr='1'
Creturn
或如下例子
Dptr2s*
Dbufs30abased(ptr1)
Dbuf1s20a
Cevalptr2=%alloc(20)
Cevalptr1=%alloc(%size(buf))
Cevalbuf='gaodianhuaisagoodboy'
Ceval%str(ptr2:
20)=%str(p