1、用法ile rpg例子变量声明1、 整数(i(整数)、b (二进制)、s(区位十进制)、p (压缩十进制)i(整数)只可为3、5、10、20个字节长。dposls5i 0inz(*zero)dpos2slOi 0inz(*zero)dpos3s3i 0inz(*zcro)dpos4s20i 0inz(*zero)注意s(区位十进制)dpos5s16s 0 inz(*zero)2、 浮点数只能定义为4字节和8字节dfls4finz(*zero)df2s8fin z(* zero)cevalf2=121212.12121212cf2dsplycevalfl=121212.12121212cflds
2、ply注意在小数点位数必须为blanko8字节相当于double4字节相当于floatdsply +1.2l21212e+053、 字符串das30a inz(*blank)a单字节或多字节n指示符,单字节4、 数组这里只说明运行时数组darrays2s 0 dim(12)引用array(下标),下标从1开始。dcharrs5a dim(12)5、 基指针基指针必须为4字节,且必须与4字节边界对齐。6、 结构D ParmDSDS1024D SFldl50D SFld2200DC*ENTRYPListCParmParmDSC*这是我们经常使用的一种结构定义方式和使用方式,这种用于传递人口参数的数
3、据结构,一定 不能使用1NZ关键字。Dints2s 0 inz(*zero )Cevalcharl = 1CmovelcharlintCintdsplyCeval*inlr=TCreturn此时字符串实际长度小于数字长度,movel时,此时int显示DSPLY 10Dcharls1a inz(*blank)Dints2s 0 inz(*zero )Cevalcharl = 1CmovecharlintCintdsplyCeval*inlr=1Creturn此时字符串实际长度小于数字长度,move时,此时int显示DSPLY 1Dcharls2a inz(*blank)Dints2s 0 inz
4、(*zero )Cevalcharl =12CmovecharlintCintdsplyCeval*inlr=1Creturn此时字符串实际长度等于数字长度,movel和move时,此时int都显示DSPLY 12Dcharls3a inz(*blank)Dints2s 0 inz(*zero )Cevalcharl = 123CmovelcharlintCintdsplyCeval*inlr=1Creturn此时字符串实际长度大于数字长度,movel时,此时int显示DSPLY 12move时,此时int显示DSPLY 23当int向char移动时也遵循这个结果.函数比拟一、 字符函数das
5、30ainz(*blank)dbs20ainz(*blank)des50ainz(*blank)1、 字符串连接Cevala=gaodianhua,Cevalb= is a good boyCevalc=a+bCCdsplyc*c的值dsply为gaodianhuais a good boyCevala=%trim(a)+%trimr(b)c adsplyc*c的值dsply为gaodianhua is a good boy2、 扫描字符串Cevalpos=%scan(,oo:a:1)Cifpos = 0c not found1dsplycelsec posdsplycendif3、%chec
6、k(comparator:base:start):在 base 串中查找第一个不在 comparator 中存 在的字符的位置,如果base市的所看字符均在comparator中存在,那么返回0。%checkr(comparator:base:start):在 base 串中查找最后一个不在 comparator 中存在的字符的位置,如果base中面所有的字符均在comprator中存在,那么返回0。 4、%SUBST (字符串:开始位置:长度)返回自变量字符串的一局部。它也可用作带 EVAL操作码的赋值的结果5、%STR (基指针:最大长度)(右边)%STR (基指针:最大长度)(左边)%a
7、lloc(number)Deallocptr1%realloc(ptr:number)Number /、须是不带小数的非浮点数。%STR既可以用来获取以NULL结束的字符串(当在表达式的右边使用时,此函数返 回第一个参数指向的数据,直至(但不包括)指定长度中找到的第一个空字符(xW)o 可在字符表达式有效的位置处使用此内置函数。在运行时,假设在指定的长度中找不到 NULL终止符,那么不出错。在此情况下,结果值的长度与指定的长度相同。),又可以用 来存储以NULL结束的字符串(当在表达式的左边使用时,%STR(ptr:length)将表达 式右边的值赋给指针指向的存储器,并在尾部添加以NULL结
8、束的字节。可指定的最 大长度是65535o这表示最多可使用右边的65534字节,因为必须为末尾的NULL 终止符保存1个字节。)。对基指针操作,务必现分配空间或赋值一个已分配空间的地址。DptrlsDbufs20a based(ptr2)Cevalptr1=%alloc(20)Ceval%str(ptr1:20)=,gaodianhua,Cevalptr2=%alloc(20)Cc*与下面的结果相同evalbuf=,gaodianhua,ceval%str(ptr2:20)=,gaodianhua,举例:Dptrls*Dbufs20aCevalptr1=%alloc(20)Ceval%str(
9、ptr1:20)=gaodianhua is a good boyCevalbuf=%str(ptr1:20)C* 或evalbuf=%str(ptr1)CbutdsplyCdeallocptr1Ceval*inlr=1Creturn或如下例子Dptr2s*Dbufs30abased(ptrl)Dbufls20aCevalptr2=%alloc(20)Cevalptr1 =%alloc(%size(buf)Cevalbuf=gaodianhua is a good boy,Ceval%str(ptr2:20)=%str(ptr1:30)Cevalbuf1=%str(ptr2)C buf1dsp
10、lyCdeallocptr2Cdeallocptr1Ceval*inlr=1Creturn注意:Darrs20a dim(5)Dparrs* dim(5)Dents3p 0Cforcnt=1 to 5 by 1Cevalarr(cnt)=gaodianhua+%char(cnt)CendforCevalparr=%addr(arr)C*%addr的参数是数组的名时,那么在基指针中存放的都是数组arr第一个元素C* 的地址Cevalparr=%addr(arr(*)(?当2(13的参数是带下标(*)的数组名时,那么在基指针中存放的相应元素的地址Cforcnt=1 to 5 by 1Cevalgd
11、h=%str(parr(cnt) :20)C gdhdsplyCendfor6.%REPLACE (替换字符串:源字符串:开始位置:要替换的源长度)Dsrc_strs30ainz(*zero) VARYINGDrpl_strs15ainz(*zero) VARYINGDgdhs40aCevalsrc_str=gaodianhua,is a good boy1Cevalrpl_str=liuhaitaoCevalgdh=%replace(rpl_str:src_str)C*gdh=1iuhaitao ,is a good boy,Cevalrpl_str= not*Cevalgdh=%repla
12、ce(rpl_str:gdh:%scanC,Csrc_str)+3)C*gdh=*liuhaitao ,is notood boy,Cevalgdh=%replace(rpl_str:gdh:%scan(,Csrc_str)+3:4)C*同上C*gdh=liuhaitao ,is notood boy,Cevalgdh=%replace(rpl_str:gdh:%scanC,Csrc_str)+3:0)C*gdh=liuhaitao ,is not a good boy,当第 4 个参数为 0 时,那么插入 rplCevalgdh=%replace(rpl_str:gdh:%scan(,Csr
13、c_str)+3:8)C*gdh=1iuhaitao ,is notboy,Ceval*inlr=1Creturn其中VARYING表示该变量长度可变,不是固定长度。假如定义了变量buf。Dbufs30a inz(*zero)Cevalbuf=,gaodianhua,Cevallen=%len(buf)C*len=30Dbufs30a inz(*zero) varyingCevalbuf=,gaodianhua,Cevallen=%len(buf)C*len=10Varying的效果等同于:Cevallen=%len(%trim(buf)转换及日期函数str1、%char (表达式:格式):可
14、以将数字、日期、时间或时间戳记数据转换为字符型。当表达式是日期、时间或时间戳记数据时,要将返回的字符数据转换成的日期、时间或时间戳记格式。如:%char (date:*iso)或 %char (time: *hms)2、int(数字表达式):%INT将数字表达式的值转换为整数。截断所有小数%inth(数字表达式):与山丁相同,不同点:转换为带四舍五入的整数格式3、%float(数字表达式):将数字表达式的值转换为浮点格式。4、%xlate(from:to:string:startpos):# string 中的 startpos 位置开始将存在的 from 传替换为to转换后返回的值具看与st
15、ring相同的类型和长度。(1)如果在string中包含from串中的第n个字符,那么将使用to串中的第n个字符替 换。(from和to的串长度n)(2)如果to串长度小于from串长度,那么to为了匹配from的长度,那么to自动使用空格填充,并且和from中的每一位对应.(3)如果to串长度大于from串长度,贝?from只匹配to串中from个串长度各字符。 举例:Dfroms30ADtos30ADbufs40A(1) from串长度=to串长度Cevalfrom=123Cevalto=abccevalbuf=123456,cevalbuf=%xlate(from:to:buf)Cbuf
16、dsplyBuf 显示为:abc456(2) from串长度vto串长度Cevalfrom=123Cevalto=abcdcevalbuf=123456,cevalbuf=%xlate(from:to:buf)CbufdsplyBuf 显示为:abc456(3) from串长度to串长度Cevalfrom=1234Cevalto=abccevalbuf=123456,cevalbuf=%xlate(from:to:buf)CbufdsplyBuf显示为:abc56 /*4被空格替代*/当to的定义长度大于实际赋值长度时会出现这种情况 否那么不会出现空格代替的情况.如下例:Dfroms30ADt
17、os3ADbufs40ACevalfrom=1234Cevalto=abcCevalbuf=123456,Cevalbuf=%xlate(from:to:buf)CbufdsplyBuf显示为:abc456 /*4未被空格替代*/ 实际上from和to之间的位数是对应的。假如 from=,1234to=,abc,1a2-b3c4的对应情况比拟复杂,分两种情况 当机 en(to) = %len (%trim(to) UJ-4无对应当%len(to) %len(%trim(to)B?f4空格假如 from=,12,Jto=,abc,1a 2-bTo中的c有from中的谁来对应呢? 分两种情况当%l
18、en(from)=当 en (祝rim (from)时c无对应当%len(from) %len(%trim(from)时c空格Dcharls10ainz(*blank) varyingDchar2s10ainz(*blank)Dtos3ainz(*zero )Dfroms2ainz(*zero)Dicccccccs10i 0 inz(*zero )evalcharl =abcoobbevalfrom=12evalto=abcevalcharl =%xlate(from:to:12 2145)charldsplyeval*inlr=1return此时charl显示为:abba45当from有如下
19、定义时Dfroms3a inz(*zero)Charl 显示为:abcba455、和日期有关的函数 %date (expression:date-format):将表达式的值由字符、数字或时间戳记数据转换成 日期型,第一个参数是要转换的值。如果不出现任何参数,那么%DATE返回当前系统 日期。对于字符或数字输入,第二个参数是日期格式。无论输入具有什么样的格式,输 出总是以*ISO格式返回。注意:当被转换的表达式的值没有任何分隔符时,那么使用具体的date-format加”0”的方 式实现格式转换。如下:(1).表达式没有任何分隔符Ddatestrs10ainz(20060821)Ddatesd
20、Cevaldate=%date(datestr:*isoO)C datedsply(2).表达式有分隔符。Date-format假设是*ISO,那么默认为叱“Ddatestrs10ainz(2006-08-21,)DdatesdCevaldate=%date(datestr:*iso)C datedsply(3) .%date()不指定任何参数,那么返回系统日期(*ISO )DdatesdCevaldate=%date()C clatedsplyDate-fromat的格式共有如下几种:RPG名称描述格式(缺省分隔符)有效分隔符 Length 例如*MDY月/日/年 mm/dd/yy8 01/
21、15/91*DMY日/月/年dd/mm/yy8 15/01/91*YMD年/月/日yy/mm/dd/.,&8 91/01/15*JUL儒略历 yy/ddd6 91/015*ISO国际标准组织 yyyy-mm-dd-10 1991-01-15*USA旧MUSA 标准mm/dd/yyyy /10 01/15/1991*EURIBM 欧洲标准 .10 *JIS日本工业标准公元纪元 yyyy-mm-dd -10 1991-01-15%TIME(expression:time-format):将表达式的值由字符、数字或时间戳记数据转换成时间型o转换后的值保持不变,但是作为时间返回。第一个参数是要转换的值
22、。如果不指定任何参数,那么%TIME返回当前系统时间。对于数字或字符输入,第二个参数是时间格式。无论输入具有什么样的格式,输出总是以*ISO格式返回。Time-format 的格式:RPG名称描述格式(缺省分隔符)有效分隔符 Length 例如*HMS小时:分钟:秒 hh:mm:ss:8 14:00:00*ISO国际标准组织.8 *USA旧MUSA标准。AM和PM可以是大写和小写的任意混合。 hh:mm AM orhh:mm PM : 8 02:00 PM*EURIBM 欧洲标准 hh.mm.ss .*JIS日本工业标准公元纪元hh:mm:ss :8 14:00:00%years (numbe
23、r) %months(number) %days(number) %hours(number) %minutes(number) %seconds(number) %mseconds(number) DdatesdDtimeStCevaldate=%date()Cdatedsplycevaltime=%time()ctimedsplycevaldate=date+%years(2)+%months( 13)c cdaledsply+%days(10)cevaltime=time+%hours(3)+%minutes(30)c ctimedsply+%seconds(30)将数字转换成可以添加到
24、日期或时间戳记值的持续时间。左边的值必须是日期或时间戳 记。结果是加上或减去了适当年数的日期或时间戳记值.注意:日期经过加减运算后具有不可逆性如Date=2006-08-31Eval date=date+%months(1 )-%months(1)现在date的值是:2006-08-30%SUBDT(value:*MSECONDS|*SECONDS|*MINUTES|*HOURS|*DAYS|*MONTHS|*YEARS)%SUBDT(value:*MS|*S|*MN|*H|*D|*M|*Y)%subdt:抽取日期、时间或时间戳记的一局部,并返回。第一个参数是日期、时间或时间戳记值。第二个参数
25、是要抽取的局部。对于日期:*DAYS、*MONTHS 和 *YEARS对于时间:*SECONDS. *MINUTES 和 *HOURS对于时间戳记:*MSECONDS、SECONDS、*MINUTES、*HOURS、*DAYS、*MONTHS和 *YEARS对于此函数,*DAYS总是指一个月中的天而不是一年中的天(即使使用儒略日期格式亦如此)。例如,2月10日的天局部是10而不是41。此函数总是返回4位的年份,即使日期格式使用2:位的年份亦如此。如:Ddatesd inz(D,2006-8-21,)Dtimest inz(T22.58.32)Dnums8p 0Ceval num=%subdt(
26、date:*years)C*num=2006Cevalnum=%subdt(date:*days)C*num=21Ceval num=%subdt(time:*hours)C*num=22Ceval num=%subdt(time:*minutes)C*num=58SUBDUR操作可用来:减去持续时间以建立新的“日期”、“时间”或“时间戳记”计算持续时间Subdur操作码的用法:Ddate 1sd inz(D2006-08-21,)Ddate2sdDyys2p0 inz(2)Dmms2p0 inz(2)Ddds2p 0 inz(10)C dateldsplyC datelsubdur yy:*
27、ydate2C datelsubdur mm:*mdate2C datelsubdur dd:*ddate2C date2dsplyC*date2=D,2006-08-11,Cdatelsubduryy:*ydate2Csubdurmm:*mdate2Csubdurdd:*ddate2C*date2=D,2004-06-11,在 subdur 的因子 1(date1 出现了 3 次还是 1 次)C*要注意两次date2值得区别C*等价于adddur的用法Cdateladddur-2:*ydate2Cadddur-2:*mdate2Cadddur-10:*ddate2C*Cdatelsubdur
28、-2:*ydate2Csubdur-1:*mdate2Csubdur-10:*ddate2C*date2=D2008-10-0T/*9 月份只有 30 天*/C*等价于adddur的用法Cdateladddur2:*ydate2Cadddur1:*mdate2cadddur10:*ddate2C*date2= D2008-10-01/*9 月份只有 30 天*/Cdate2subdurdatelnum:*yC*num=2Cdate2subdurdatelnum:*mC*num=25 t“date2-date1 差 20 天满 26 个月*/C*等价于%diff函数用法如下:Cevalnum=%
29、diff(date2:date1 :*m)ceval*inlr=1creturn%DIFF (两个日期、时间或时间戳记值之间的差)%DIFF(op1:op2:*MSECONDS|*SECONDS|*MINUTES|*HOURS|*DAYS|*MONTHS|*YEARS)%DIFF(op1:op2:*MS|*S|*MN|*H|*D|*M|*Y)TEST操作允许在使用前测试日期、时间或时间戳记字段的有效性。Test的用法:因子1操作码结果字段指不符Test(E)日期/时间或时间戳记字段-ER-日期格式Test(DE)字符或数字字段-ER-时间格式Test(TE)字符或数字字段-ER-时间戳记格式T
30、est(ZE)字符或数字字段-ER-具体的日期格式、时间格式、时间戳记格式在上面都做了相应的注释。对于测试操作,必须指定操作码扩充符“E”或错误指示符ER,但不能同时指定。一般情况下操作码带扩展符E时,那么应和ERROR配合使用。如果结果字段变量已声明为“日期”、“时间”或“时间戳记”的字段,那么不能指定 dtzformat (因子1)的操作数,并且不允许操作码扩充符“口”、T 和 2 精度转换函数%DEC(numeric expression:precision:decimal places)%DEC将数字表达式的值转换为带精度位和小数位的十进制(压缩)格式,假设省略这 些参数,那么从数字表
31、达式的属性中获取精度和小数位。%DECH (数字表达式:精度:小数位)%DECH将进行四舍五入,所有三个参数都是必需的。%DECPOS (数字表达式)%DECPOS返回数字变量或表达式的小数位数。返回的值是常数,因此可参与常数合 并。数字表达式一定不能是浮点变量或表达式。Dp7s7p 3 inz (1234.567)Ds9s9s 5 inz (73.73442)Df8s8f inz (123.456789)D resultls15p5D result2s15p 5D resultss15p5D result4s5i0Cevalresultl =%dec(p7)+0.011C*Mresult1
32、is now1234.57800Cevalresult2=%dec (s9 : 5: 0)C*Mresult2 is now73.00000Cevalresult3=%dech (f8: 5: 2)Cresult3 is now123.46000Cevalresult4=%decpos(p7)Cwresult4M is now3%len 和5126%len(表达式):可用来取得变量表达式的长度,或设置变长字段的当前长度%len在右边时:在表达式的右边使用时,这个函数返回变量表达式的位数或字符数。对于数字表达式来说,返回的值表示表达式的精度而不一定是有效数字的实际位数。对于浮点变量或表 达式,返
33、回的值是4或8。当参娄是数字文字时,返回的长度是文字的位数。对于字符、图形或UCS-2表达式,返回的值是表达式值中的字符数。对于可变长度值(如从内置函数返 回的值或变长字段),%LEN返回的值是字符、图形或UCS-2值的当前长度。%len在左边时:这个函数设置变长字段的当前长度。如果设置长度比当前长度长,那么将字段中 旧长度和新长度之间的字符设置为空格。DienS3i0DintS10i0DcharlOS10 varying inz(abcde)Dch10S10 inz(abcde)DCevallen=%len(int)C*len=10(字符数或位数)Cevallen=%size(int)C*l
34、en=4(占用字节数)C*对于使用了 VARYING关键字和不使用的区别Cevallen=%len(char10)C*但是,如果该结构不是作为程序入口参数或是作为下级调用的接口参数,一般要在工程中约定 使用INZ关键字。INZ关键字会让系统在程序被激活时,自动按结C*构各子字段的类型自动初始化, 数字零。DmystrudsD nameD ageD memoDaddr1Dtell21Dte1233或DmystrudsD nameD age D memo D addrD tell D te!2 或 DmystrudsD nameD ageD memoD addrD tellD tel2D othe
35、r多重数据结构及使用DmystrudsD nameD ageD memoD addrD tellD te12D otherDentsC*给第一个mystru赋值否那么上述结构中SFIdl字段的值将是一个非法的空格值而不是20a3s 044a20a32a42a6820a3s 044a20a overlay(memo: I)12a overlay(memo:21)12a overlay(memo:33)20a3s 044a20a overlay (memo)12a overlay (memo: *next)12a overlayCmemonext)12aoccurs(lO) inz20a3s 04
36、4a20aoverlay (memo)12aovcrlay(mcmo: *ncxt)12aoverlay(memo: *next)12a2s 0 inz(*zero)C1occurmystruCevalname=高殿华cevalage=3()cevaladdr=河北省吴桥县cevalC*len=5Cevalien=%size(char10)C*len=12(应该加上2)Cevallen=%len(ch10)C*len=10(虽然进行了初始化,但是他有空格填充)Cevallen=%size(int)C*len=10(占用字节数)%SIZE (变量)%SIZE (文字)%SIZE (数组:*ALL
37、)%S1ZE (表:*ALL)%SIZE (屡次出现数据结构:*ALL)%SIZE返回常数或字段占用的字节数。自变最可以是文字、命名常量、数据结构、数据结构子字 段、字段、数组或表名。它不能包含表达式,但可以接受一些具有常数值的内置函数和常量表达式。 返回的值是无符号整数格式(类型U)o对于图形文字来说,大小是图形字符占用的字节数。对于 十六进制或UCS-2文字,返回的大小是文字中十六进制位数的一半。对于变长字段来说,SIZE返 回字段占用的总字节数(比声明最大长度长两个字节)。假设自变量是数组名、表名或屡次出现数据 结构名,那么返回的值是一个元素或值的大小。假设将*ALL指定为%SIZE的第
38、二个参数,那么返回的 值是所有元素或值占用的存储器。对于包含指针子字段的屡次出现数据结构来说,该大小可能大于 一个值乘以值数的大小。这是可能的,因为系统要求将指针放在地址为16的偶数倍的存储器中。 这表示可能必须增长各值的长度以使其足以是16的精确倍数,以便在存储器中正确定位各值的指 针子字段。数据库文件 操作1、 read代码 因子1因子2 结果字段指示符READ (E N)文件名 data-structure _ ER EOFREAD (E N)记录名_ ER EOF附录资料:不需要的可以自行删除Abstract: Based on the comprehensive analysis o
39、n the plastic parts structure service requirement, mounding quality and mould menu factoring cost. A corresponding injection mould of internal side core pulling was designed. By adopting the multi-direction and multi-combination core-pulling. A corresponding injection mould of internal side core pul
40、ling was designed, the working process of the mould was introduced C语言详解-枚举类型注:以下全部代码的执行环境为VC+60在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可 能是:#define MON 1#define TUE 2#define WED 3#define THU 4#define FRI 5#dcfinc SAT 6#define SUN 7在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。1 .定义一种新的数据类型-枚举
41、型以下代码定义了这种新的数据类型-枚举型enum DAY MON=1,TUE, WED, THU, FRI, SAT, SUN;(1)枚举型是一个集合,集合中的元索(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。2 2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。(3)第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。(4)可以人为设定枚举成员的值,从而自定义某个范围内的整数。(5)枚举型是预处理指令#define的替代。(6)类型定义以分号;结束。3 .使用枚举类型对变量进行声明新的数据类型定义完成后,它就可以使用了。我们已经见过
42、最基本的数据类型,如:整型im,单精度浮点型floai, 双精度浮点型double,字符型char,短整型short等等。用这些基本数据类型声明变量通常是这样:chara; /变量a的类型均为字符型charcharletter;intx,y,z; /变量x,y和z的类型均为整型intint number;double m, n;double result; /变量result的类型为双精度浮点型double既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。方法:枚举类型的定义和变量的声明分开enum DAYMON=1,TUE, WED, THU, FRI, SAT, SU
43、N cnum DAY yesterday;enum DAY today;enum DAY tomorrow; 变量 tomorrow 的类型为枚举型 enum DAYenum DAY good_day, bad_day; 变量 good_day 和 bad_day 的类型均为枚举型 enum DAY 方法二:类型定义与变量声明同时进行:enum 跟第一个定义不同的是,此处的标号DAY省略,这是允许的。 (Saturday, sunday = 0, monday, tuesday, Wednesday, thursday, friday workday; 变量workday的类型为枚举型enum DAY
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100