变量(容器)的知识
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
?变量(容器)的知识
谈谈容器
容器在程序中是最重要的角色,具有载数和传数的功能,对容器赋值正是对内存中某一个地址单元赋值。容器1,容器2,就是两个不同的地址单元,唯一不透明的地方就是不知道是哪一个地址,这正是高级语言的特色,可以脱离具体的硬件进行操作。
容器的工作对象具有分工:有的可以载数值,有的可以载文本,有的可以载字节集等。
容器的工作范围也有划分:如全局容器,就象长途汽车,是跑长途的,在整个程序中都适用;程序集容器就是跑中途的,只能在一定的范围内运行,通常属于某一个窗口;而子程序容器就是跑短途的,只能在更小的范围内运行,通常属于某一个窗口单元,如跟着“按钮”打工。
原则上全局容器和局部容器在命名上最好不重名,不过易语言是支持重名的,要在命名时进行声明。如果在子程序中命名一个容器和程序集在取名上犯冲,如大家都叫容器1,就要及时声明这是属于该子程序的,否则就会出现混乱。同一程序集下不同的子程序可以使用同名容器,不同的程序集下也可以使用同名容器,因为这里隔着一道“墙”,它们相互之间是没有影响的,或者叫:隔席不说话。
每一个容器在投入工作前都有一个初始状态,一定要弄清楚这一点:全局容器只在打开运行程序时有一个初始的过程,程序集容器会在打开某一窗口时有一个初始过程,子程序容器只有在操作某一个对应的窗口单元时有一个初始过程,数值容器在初始化时其值为0,文本容器在初始化时其值为空等等。
容器有静态和动态之分,这是一个重要的概念,一个容器在程序操作过程中只有一次初始化以后不再经过初始化就具有静态特征,如全局容器,可以用来在窗口之间传递数据。程序集容器就只能在同一窗口中对不同的单元操作传递数据。经常有人问如何在两个窗口之间赋值就是指的这一点。静态是相对的,全局容器相对于子窗口是静态的,程序集容器相对于同一窗口单元也是静态的,一个子程序中的容器要想具有静态特色就要进行设置。如:在一个子程序中执行“容器1=容器1+1”,当再一次进入该子程序时,通常容器1=0,如需要保留上一次的数值即带着上一次的状态进入,就要设其为静态。与些相反,在子程序中使用程序集容器时,如再一次进入子程序,只要不出该程序集,容器都有保留状态的特色,而在有一种情况下我们却不需要它这个保留,如在一个子程序中调用另一个子程序,所设定的容器将在这两个子程序中都发生作用,肯定是要使用程序集容器,而当我们每一次都需要有一个初始
状态时,就只有令:容器1=0。以上这两种情况相反的使用,常常让初学的人摸不着头脑。
进一步地看,画板,编辑框,窗口标题等都是更高层次的容器,因为都具有赋值功能,可以向其中添加文本,图片等,不过这个大容器是有很多属性的,作为容器来理解,才会将一个可执行文件作为图片资源来处理。
编写一个大型程序一定要进行容器的命名上的管理,最好用一张纸进行纪录,以避免重复使用造成不应有的麻烦。
--------------------------------------------------------------------------------
易中的“容器”即其它语言的“变量”。
变量主要掌握以下几个概念:
一、存在性
变量在当前是否存在。
二、可用性
变量在当前是否可引用。
三、局部性
就是变量以上两个特性的有效范围。
注意:
1、可用一定存在,但存在并不一定可用。如:静态变量。
2、局部性表明程序可按一定范围从大到小划分,也可以说一个程序是由许多小范围组成的一个整体。
变量(容器)的知识(一)
㈠、变量(容器)的含义和作用
变量观念是培养程序设计能力的基础,因为在程序中的数据都必须通过变量来处理,而为了处理不同的数据,必须使用不同的变量类型。为了使初学者明白变量的涵义,下面变换几个角度来阐述之。
平时我们上街的时候,大多数人总会拎个小包或者手提袋什么的,装上点儿琐碎的东西,回家以后就取出东西来,将袋子扔到一边去。告诉你,计算机里也得用上这种小包或小袋子,把我们输入的字符串或者数值装起来,要的时候就取出来。
易语言中的小包、小袋子就是变量,也称为容器。变量可以保存临时数据,但是变量中保存的数据在计算机关上之后就不再存在,因为它只是临时的保存,以节省内存空间。用户还可以根据需要来改变变量中的数据,但修改之前,数值是不变的。
变量还能用来在函数或过程中传递参数(在函数或过程中需要处理的数据对象),也就是说,参数也是一种变量(但不能说变量就是参数)。见名知意,变量的值是可以改变的。所以变量也可以通俗地不准确地表述为事先(赋值之前)没有固定值的数据类型。
简单地说,变量是用来代表某内存位置的名称,即在内存中存放未知值的所在处,您可以利用变量名称将数据临时保存到内存中;反之,也可以通过变量名称将内存中的数据取出以供我们的程序使用。
例如,为水果铺编一个销售苹果的软件时,由于在销售实际发生之前并不知道苹果的价格和销量,因此,可以设计两个变量来保存未知数,将它们命名为“苹果价格”和“
苹果销量”。每次运行程序时,用户就为这两个变量提供具体值。为了计算总的销售额,并且将结果显示在名叫“总额文本”的编辑框中,代码应该是这样的:
总额文本.内容=苹果价格×苹果销量
根据用户每次提供的数值,这个表达式返回不同的金额。因此,有了变量就可以设计一个算式,而不必事先知道实际的输入是多少。又如下面的算式:
文本1长度=2000
“文本1长度”就是一个变量的名称,计算机会自动配置“文本1长度”对应的内存位置,而上述表达式的作用是将数值2000保存到“文本1长度”对应的内存位置上。
变量具有名字(用来引用该变量所含的值的名词)、值(该变量实际的值)和数据类型(确定变量可以存储的数据的种类,依内存大小而定)这三个要素。注意,变量和变量值是两回事,例如,我们可以设置变量“颜色”,它的值可以是“红色”、“蓝色”等等。
变量是一种跟常量不同的数据类型(见《基本数据类型》一节),在程序中我们可以把所有元素都当成数据来处理,那么也可以把这些东西用变量来处理。比如,当“_按钮1_鼠标左键被按下”事件出现时,让“鼠标状态”这个变量的值为“1”,即:鼠标状态=1,而当“_按钮1_鼠标左键被放开”事件出现时,鼠标状态=0,于是我们就可以根据不同的事件来决定程序的运行状态,比如:
子程序:_按钮1_鼠标位置被移动
返回值类型:逻辑型
参数:横向位置数据类型:整数型
参数:纵向位置数据类型:整数型
参数:功能键状态数据类型:整数型
如果真(鼠标状态≠0)
按钮1.左边=(按钮1.左边+横向位置)-按钮1.宽度÷2
按钮1.顶边=(按钮1.顶边+纵向位置)-按钮1.高度÷2
如果真结束
上面这个子程序可以实现按钮1随按下的鼠标移动而移动。
为了使大家进一步了解变量储存临时数据的作用,再举一例。除了用一般变量来储存临时数据,其实也可以用控件的属性(对象型变量)来储存临时数据,比如为了实现象记事簿一样可以选择是否自动换行的效果,可用下面的程序集:
子程序:__启动窗口_尺寸被改变
编辑框1.高度=取用户区高度()
编辑框1.宽度=取用户区宽度()
※模拟记事本的编辑框效果
------------------------------
子程序:_自动换行_被选择※“自动换行”是一个子菜单名称
自动换行.选中=取反(自动换行.选中)
※取反:如果参数值为真则返回假,如果参数值为假则返回真。
标签1.标题=编辑框1.内容
编辑框1.是否允许多行=取反(编辑框1.是否允许多行)
编辑框1.内容=标签1.标题
在上面的“_自动换行_被选
择”子程序中,用“标签1”来储存临时数据。如果我们用其他类型的变量来储存数据,就不用在程序上多加“标签1”这个控件,但要先声明该变量,如:
子程序:_自动换行_被选择
局部容器:编辑框内容数据类型:文本型
※“局部容器”即“局部变量”
自动换行.选中=取反(自动换行.选中)
编辑框内容=编辑框1.内容
编辑框1.是否允许多行=取反(编辑框1.是否允许多行)
编辑框1.内容=编辑框内容
上面两个例程下载:1、/leoboard/non-cgi/usr/13/13_147.e
2、/leoboard/non-cgi/usr/1/1_4698_10.e
变量(容器)的知识(二)
㈡、变量(容器)的数据类型
在易语言中提供了多种数据类型,以供用户在编写代码时使用。一般常用的是:数值型、文本型(字符型)、逻辑型(布尔型)和对象型。其实各种类型各有所长,我们在编程时应根据具体需要来决定所定义的变量类型。一般来说数值型变量存放数字,文本型变量存放文本。
变量所占用的内存大小根据变量的数据类型而定,依照变量中保存数据的特性,可概括分为:
┌—字节型变量
│整数型变量
│短整数型变量
┌—数值型变量—│长整数型变量
││小数型变量
│└—双精度小数型变量
│文本型变量
│逻辑型变量(布尔型变量)
变量(容器)—│日期时间型变量
│字节集型变量
│子程序指针型变量
│
│┌—窗口
└—对象型变量—│编辑框
│图片框
│......
│菜单
└—字体
以下是一些变量的声明(建立容器)与初值赋值实例:
⑴、数值型变量。
数值型变量依字节的长度分为字节型、整数型、小数型等等。数值型变量应用如:
容器1=3.1456289
⑵、文本型变量。
所谓文本(字符串)是指由字母、数字、汉字或标点符号所组成的一串字符集合。文本型数据必须存放在文本型变量中,而表示文本时,必须在文本的前后使用双引号(“)。
初学者常常会忘记在文本前后加双引号,就会出现错误。比如你建立一个叫“文本a”的文本型变量,如果你这样赋值的话:文本a=2.147483647568,运行时会出现错误提示:
“错误(20026):现行容器或参数的数据类型与传递给它的数据的类型不一致”。
文本型变量的正确写入方法如下面的例子:
文本a=“2.147483647568”
文本1=“abc”
文本2=“新年快乐!”
文本3=“祖国,您好!”
在文本中可以连接特殊字符,如换行符、空格等。下面是使用特殊字符的例子:
内容1=“你选择的数值是:”+到文本(数值1)+#换行符+“你要说的话是:”+#左引号+“
祖国,您好!”+#右引号+“。”
上面语句中的“+”号在易语言中是一个连接符号,即将相同类型的数据连接起来。其中的“数值1”是数值型变量,为了使赋值数据与被赋值变量之间的类型一致,就要把上例的“数值1”转化为文本型,否则就会有出错提示。
在易语言中,文本中的空格符用“”之类表示。
⑶、逻辑型变量。
逻辑型数据是一种只有“真”和“假”两种状态的数据类型,这种数据类型通常使用与逻辑判断运算中,例如下例中的“清除”是逻辑型变量:
如果(清除=真)则
清除=假
文本=“0”
否则
清除=真
结束如果
⑷、对象型变量。
对象可以说是一群属性的集合,每一个属性都有一个名称(name)和数值(value),属性的数据类型可以是前面介绍的任何一种。
由于对象型变量比较特殊,我们在界面上画上一个控件就表示该控件的各种属性变量已被建立,所以不用再另外建立容器来存放这种变量。
表示对象的某一属性时使用点“.”符号,例如:
编辑框1.内容=标签1.标题
编辑框2.内容=“100”
编辑框3.左边=100
窗口1.可视=真
哈哈哈=按钮1※先将“哈哈哈”定义为按钮型变量(对象型变量),再赋值为“按钮1”。
从对象的各种属性值事先未知这一点来说,对象的属性就是一种变量,属性值也即是变量值。
变量(容器)的知识(三)
㈢、变量的声明和赋值
★、变量的声明(容器的建立)
为了使用变量,需要为变量指定一个名称和规定该变量所保存的数据类型,有时要确认是否为静态容器、是否数组容器,以便将变量事先通知程序,这项工作称为声明变量,又称建立容器。易语言强制必须声明变量后才能使用变量(对象型变量除外)。如果没有经过声明就使用该变量,比如:容器1=“100”(容器1还没有被建立),那么使用该容器的代码行就会无法确认,并出现“编译错误”提示框:
“找不到指定的容器名称:容器1”
⑴、那么怎样建立容器呢?分几种以下情况:
①、建立局部容器(又称子程序容器,即局部变量)。
第一种方法:在代码编辑区选中子程序,再选菜单“插入→新局部容器”,就会在该子程序下出现一个空的容器表格,在“容器名”一栏填上你需要的任意名称,再填上数据类型,其余的“静态”、“数组”、“备注”等根据情况而定。容器的表格内容相当于VB中的“Dim变量名As变量类型”这个语句。
第二种方法:在代码编辑区选中子程序,按下Ctrl+L加入一个空容器,再添加容器内容。
②、建立程序集容器。
在代码编辑区选中程序集,然后按[Enter
]键。
③、建立全局容器。
选菜单“插入→新全局容器”,或点击“工作夹→程序子夹→全局容器”。
⑵、容器的命名规则。
我们既可以给变量起一个任意的名称,也可以在变量中存放任何想要存放的东西。但是如果用户在一个名为“电话”的变量中存放一个人的生日代码,显然是不明智的。
这里我们提醒同学们,为了方便起见,变量名应该代表存放在其中的数据信息。比如说,变量名“电话”一般用来存放电话号码,变量名“生意”应该存放做生意的名称等。
在给变量命名时必须遵守一些规则,否则易语言系统会大发脾气,不确认你的命名,并教训你,如:
错误⑴:指定名称“容器()”无效,名称首字符必须为全半角字母或汉字,其他字符必须为全半角字母、全半角数字或汉字
★、容器的赋值
⑴、赋值的含义。
当声明了一个变量后,就必须对它进行赋值,因为声明变量时只是建立了一个空的容器,还要向里面添加东西。容器的赋值就象前面描述的是用“=”号来实现的,变量名放在“=”号的左边,表达式(所赋予的具体数据值)放在右边,其目的是将表达式的结果(返回值)赋给左边的变量。
赋值就是为了方便而把一些在程序中经常用到的数据放到一个或多个空的容器(变量)中的过程,这个过程就叫赋值。初学者可能还不太明白这个“赋值”的含义,那么下面再变换几个角度来理解。
比如“颜色”是变量,而“红色”是“颜色”这个变量中的一种具体值,我们知道,“红色”是系统中的一种常量值,它的颜色值是“255”,也可以表达为“#红色”。确定变量的具体数值即是赋值,比如给你女朋友送一套红色的衣服,那么你女朋友这件衣服的颜色值是“红色”,衣服.颜色=#红色,即将衣服的颜色值定(赋)为红色,这个行为就叫“赋值”。
或者可以这样理解:用代码来设置变量值(包括对象属性值),就称为“赋值”。就像你原来读小学,现在读中学了,你这个人“学历”的变量值就由“小学”被赋为“中学”了。
⑵、容器的初始赋值(初始化)。
在易语言中,所有类型变量在程序被启动运行前,所有非静态局部容器在其所处子程序被开始执行前,都将被自动分配空间并初始化,也即是在声明变量的同时系统将自动赋给变量一个固定的相应的初始值。对于严格的程序设计来说,必须清楚所有类型变量的赋值状态,否则可能会导致不可预料的结果。
对于不同数据类型的变量,易语言给出的初始值是不同的。其中,数值型容器被初始化为零,逻辑型容器被初始化为假,日期时间型容器被
初始化为1899年12月30日0时0分0秒,文本型容器被初始化为空文本(“”),字节集型容器被初始化为空字节集,子程序指针型容器被初始化为空子程序指针。
⑶、赋值规则。
赋值规则可以归结为“类型要一致”:①、赋值式两边的数据类型必须匹配;②、用于相加的多个变量,它们的类型也必须匹配;③、就象上面所说,为了在赋值式中区别文本型数据和数值型数据,表示文本型数据的内容要用“”号括起来。
一般来说,容器内仅能被写入类型与容器本身数据类型一致的数据。譬如:将一个整数写入到整数型容器中,将一段文本写入到文本型容器中等。比较特殊的是:任意数值类型的数据可以被写入到任意数值类型的容器中,系统将自动进行转换。譬如将一个短整数写入到整数型容器中,将一个整数写入到小数型容器中等等,但是此时必须注意防止下面所提到的溢出问题。
打个比方,在炸炒米的机器里放入大米就是“赋值”。没有大米,整个过程就会是无米之炸,巧妇也难为啊。当大米炸好后得到米花,那可就是“返回值”(处理结果)了。在炸炒米机里可不能放入大白菜哦,这就是是所谓的类型匹配。如果不匹配,就会产生下面的错误表现:
①、容器溢出。比如下面的子程序:
子程序:_按钮1_被单击
局部容器:数值容器数据类型:短整数型
数值容器=100
数值容器=数值容器+50000
编辑框1.内容=到文本(数值容器)
我们知道,100+50000=50100,但是为什么执行上面的子程序后,编辑框的内容却是“-15436”呢?这就是我们上面中所说的溢出。因为,“数值容器”的数据类型被我们定义为短整数型,所以系统仅为此容器分配了一个短整数的存储空间,据上面所述,短整数型数值的最大值为32767,而结果值50100大于了此数值,导致系统为容器1所分配的存储空间不能容纳该数值,部分数据被丢弃,从而得到了错误的结果。
②、程序中断。若赋值式两边的数据类型不一致,就会使程序中断并出现错误提示信息,如:
子程序:_按钮1_被单击
局部容器:数值容器数据类型:短整数型
编辑框1.内容=数值容器
当运行上面的程序时,会中断运行并在状态夹的提示子夹中出现错误信息并用箭头指示出错的代码行:
“错误(20026):现行容器或参数的数据类型与传递给它的数据的类型不一致”
这是因为“编辑框1.内容”(现行容器或现行变量)的数据类型是文本型,而“数值容器”却是短整数型,两者类型不一致,造成程序出错并中断。若赋值式两边的数据类型不一致,就需要改变它们的类型使之匹配。对于对象
的属性变量来说,由于系统给予它们固定不变的类型,如果是给对象的属性赋值,就要使“=”号右边的类型与该属性的类型一致,如上例中“编辑框1.内容”是文本型,但“数值容器”是短整数型,那么上面的赋值式要这样表达才是正确的:
编辑框1.内容=到文本(数值容器)
注意,上面的语句不能表达为:编辑框1.内容=“数值容器”,否则编辑框就只会出现“数值容器”这四个字。
又如:
数值型容器1=文本到数值(编辑框1.内容)
编辑框1.内容=时间到文本(取现行时间())
赋值式右边相加的各个容器类型也要匹配,如:
子程序:_按钮1_被单击
局部容器:文本容器数据类型:文本型
编辑框1.内容=到文本(取代码(文本容器,)+到文本(标签1.左边)
好了,学习了上面的知识,你就不会再对“...类型不一致”之类的出错信息迷惑不解了。
变量(容器)的知识(四)
㈣、变量的生命周期和作用范围
台湾著名的VB专家王国荣先生说:“如果把程序比喻成人体,那么调用语句、赋值语句、条件语句、循环语句…等语句就好像人体的骨骼、器官、肌肉…等组织,而数据则像流通于其中的血液,组织一旦成形就不会改变,但血液却会到处流窜,比较不好掌握…”。
下面我们就继续说明变量这个数据类型在程序中如何充当血液的作用的。
★、变量的生命周期
我们先来看下面一个例子,这个例子是点击按钮1在编辑框1里循环变换显示0-5这六个数字,下面的代码无法实现这个功能,大家帮忙看看问题在哪里:
子程序:_按钮1_被单击
容器名:数字类型:整数
编辑框1.内容=到文本(数字)
数字=数字+1
如果真(数字>6)
数字=0
如果真结束
以上子程式表面看来好象没有什么问题,但每点击“按钮1”编辑框1里的内容都是“0”,这是为什么?类似这样的问题是初学者几乎都会遇到的。如果我们把“数字”这个容器修改为静态容器(选中该容器的静态属性),运行就会成功了:
子程序:_按钮1_被单击
容器名:数字类型:整数
编辑框1.内容=到文本(数字)
数字=数字+1
如果真(数字>6)
数字=0
如果真结束
在上面这个子程序中,每点击一次按钮1,“数字”的值都会被加一并被保留,于是每次输出到编辑框1的数字就会依次递增(0,1,2,3,4,5),到5后再从0开始循环,如下:
数字=0
数字=1
数字=2
数字=3
数字=4
数字=5
为什么子程式一每点击一次按钮,数字都是0,而子程序二每点击一次按钮,数字都会按要求变化?其关键在于静态容器和非静态容器的生命周期不同。
⑴、静态容器和非静态容器
所谓静态,就是静止存在,当所处子程序退出时,此类容器能够保留住现行内容以供下次继续使用。静态容器的最重要的特性是当子程序执行到最后时,变量所占用的内存不会被释放,而变量值一直保留着,直到程序被退出。
而非静态的容器就不能,下次进入子程序时它将被重新初始化(比如整数型变量的初始值是0),例程一中的语句“数字=数字+1”根本没有任何作用,这就是为什么非静态容器的内容在显示时始终为0的原因。非静态容器最重要的特性就是当子程序执行到最后时,变量所占用的内存就会被释放,而变量的内容也跟着消失。
在子程序一中,“数字”的生命周期起于“编辑框1.内容=到文本(数字)”,结束于“如果真结束”。但是在子程序二中“数字”的生命周期却是起于程序被载入,结束于程序被载出,子程序二中的“数字”的生命周期长于子程序一中的“数字”。
初学者可能弄不明白为什么要有静态容器和非静态容器之分,有多种理由,如:①、静态容器占用的内存资源比非静态容器多,所以能用非静态容器时就尽量不用静态容器;②、有时候变量内容需要保留,那么我们就要用到静态变量,但有时候在程序中变量的内容不需要保留,这时候如果使用静态变量同样也会出错。初学者要注意搞清什么时候要用静态容器,什么时候要用非静态容器,正如上面的例子一样。我们可以把上面例子作为静态容器应用的例程。
⑵、程序集容器
在上面的循环显示数字的例程中,我们也可以用程序集容器来代替静态局部容器,如:
窗口程序集名:窗口程序集1
容器名:数字类型:整数
程序集容器的生命周期与静态容器相同,起于程序被载入时,灭于程序被退出时。
★、变量的作用范围
无论是初学者或是专业程序员,都需要在使用变量之前,了解变量的使用范围,这是非常重要的。
所谓变量的使用范围(作用域)是指变量所起作用的范围,即变量在代码区域的哪些部分是可用的,一旦超出了这个范围变量将不可用。易语言根据变量作用的范围大小将变量分为全局容器、程序集容器和局部容器。这三种容器的建立方法请看前面的变量声明的内容。
⑴、全局容器:在全局容器表内定义的容器被称为“全局容器”,可以被整个应用程序中的所有子程序使用。
⑵、程序集容器:在程序集容器表内定义的容器被称为“程序集容器”,仅能够被此程序集中的所有子程序使用。
⑶、局部容器:在子程序容器表内定义的容器被称为“局部容器”,仅能够被此子程序所使用。
划
分变量的使用范围之所以重要,是因为我们声明变量要根据变量的作用范围而定,比如只在某子程序中使用的变量,我们就要声明为局部容器;在某窗口程序集中被两个或以上子程序应用的变量我们就声明为程序集容器;如果某变量在整个程序中都有应用,我们就声明为全局容器。
有初学者可能会说,为什么要这么麻烦,既然全局容器在整个程序中都适用,不管三七二十一,把所有变量都声明为全局容器,这样每个子程序都可以调用这些变量,不是更方便吗?我们区分全局容器、程序集容器和局部容器也有多种原因,如:
①、是为了方便侦错。也就是说如果变量的定义太乱,那么当程序出错时,我们就很难查找出错之处,尤其对于大型程序来说,侦错的工作就会非常困难。
②、由于三种变量所占用的系统内存不一样,就会对程序的运行造成不同的影响。变量按使用范围大小排列如下:全局容器>程序集容器>局部容器。占用的内存资源也是这样:全局容器>程序集容器>局部容器。所以不到万不得已,还是用局部容器好。太多的全局变量会使程序运行缓慢,比如说循环一个有50个字段10000条记录的数据库,呵呵。所以你找一个空间来存放运行你的网页程序的时候,假如全局变量过多,有些空间商会取消你的空间。可以说要尽量使用局部变量或者程序集变量,可以不使用变量的最好就不使用。
。