设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

tag 标签: FreeBasic基础教程

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

分享 Freebasic菜鸟初学Freebasic基础教程三:带参数的宏定义
ganlinlao 2017-5-8 17:43
FB语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似。 '冬瓜汤改编自c语言中文网c语言基础入门 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。 带参宏定义的一般形式为: #define 宏名(形参列表) 字符串 在字符串中含有各个形参。 带参宏调用的一般形式为: 宏名(实参列表); 例如: #define M(y) y*y+3*y '宏定义 '// Code k=M(5); //宏调用 在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为k=5*5+3*5。 【示例】输出两个数中较大的数。 #define MAX(a,b) iif(ab, a , b) Dim As long x,y,myMax input "请输入一个数字: " ,x Input "请输入另一个数字:" ,y myMax = MAX(x, y) print myMax sleep 运行结果: 输入两个数字: 10 20 max=20 程序第2行进行了带参宏定义,用宏名MAX表示条件表达式iif(ab, a , b),形参a、b均出现在条件表达式中。程序第7行myMax=MAX(x, y)为宏调用,实参 x、y 将代换形参a、b。宏展开后该语句为: max=iif(xy, x , y) 对带参宏定义的说明 1) 带参宏定义中,形参之间可以出现空格,但是宏名和形参列表之间不能有空格出现。例如把: #define MAX(a,b) iif(ab, a , b) 写为: #define MAX (a,b) iif(ab, a , b) 将被认为是无参宏定义,宏名MAX代表字符串(a,b) iif(ab, a , b)。宏展开时,宏调用语句: max=MAX(x,y); 将变为: max=(a,b)iif(ab, a , b)(x,y) 这显然是错误的。 2) 在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型。而在宏调用中,实参包含了具体的数据,要用它们去代换形参,因此必须指明数据类型。 这一点和函数是不同的:在函数中,形参和实参是两个不同的变量,都有自己的作用域,调用时要把实参的值传递给形参;而在带参数的宏中,只是符号的替换,不存在值传递的问题。 【示例】输入 n,输出 (n+1)^2 的值。 #define SQ(y) (y)*(y) Dim As Long a, sq; input "input a number: ",a sq = SQ(a+1); print "sq=" + sq 运行结果: input a number: 9 sq=100 第2行为宏定义,形参为 y。第7行宏调用中实参为 a+1,是一个表达式,在宏展开时,用 a+1 代换 y,再用 (y)*(y) 代换 SQ,得到如下语句: sq=(a+1)*(a+1); 这与函数的调用是不同的,函数调用时要把实参表达式的值求出来再传递给形参,而宏展开中对实参表达式不作计算,直接按照原样替换。 3) 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。例如上面的宏定义中 (y)*(y) 表达式的 y 都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为以下形式: #define SQ(y) y*y Dim As Long a, sq; input "input a number: ",a sq = SQ(a+1); print "sq=" + sq 运行结果为: input a number: 9 sq=19 同样输入9,但结果却是不一样的。问题在哪里呢?这是由于替换只作符号替换而不作其它处理而造成的。宏替换后将得到以下语句: sq=a+1*a+1; 由于a为9故sq的值为19。这显然与题意相违,因此参数两边的括号是不能少的。即使在参数两边加括号还是不够的,请看下面程序: #define SQ(y) (y)*(y) Dim As Long a, sq; input "input a number: ",a sq = 200/SQ(a+1); print "sq=" + sq 与前面的代码相比,只是把宏调用语句改为: sq=200/SQ(a+1); 运行程序后,如果仍然输入 9,那么我们希望的结果为 2。但实际情况并非如此: input a number: 9 sq=200 为什么会得这样的结果呢?分析宏调用语句,在宏展开之后变为: sq=200/(a+1)*(a+1); a 为 9 时,由于“/”和“*”运算符优先级和结合性相同,所以先计算 200/(9+1),结果为 20,再计算 20*(9+1),最后得到 200。 为了得到正确答案,应该在宏定义中的整个字符串外加括号: #define SQ(y) ((y)*(y)) Dim As Long a, sq; input "input a number: ",a sq = 200/SQ(a+1); print "sq=" + sq 由此可见, 对于带参宏定义不仅要在参数两侧加括号,还应该在整个字符串外加括号。 带参数的宏和函数很相似,但有本质上的区别: 宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存。而函数是一段可以重复使用的代码,会被编译,会给它分配内存,每次调用函数,就是执行这块内存中的代码。
个人分类: FreeBasic|2680 次阅读|0 个评论
分享 Freebasic菜鸟初学Freebasic基础教程一:一分钟理解指针
ganlinlao 2017-5-8 10:04
Freebasic菜鸟初学Freebasic基础教程一:一分钟理解指针
Freebsic是一门没有任何特点的开源语言,非常平庸。它是披着VB的语法羊皮,长着一颗c语言的心,怀着c++的情怀,却生在一个托管语言横行的世界。所以本系列文章,谨此献给极其少数几个喜欢Freebasic的人。 freebasic的语法和vb是极其相似的,所以如果你有vb6或vba的基础的话,那么你用Freebasic写代码几乎没有任何障碍,非常熟悉,如果你有点c语言基础的话,你马上就可以使用Freebasic,Freebasic和c是高度兼容的,而且可以使用gcc或LLvm编译。本系列适用于有点VB基础的人看,而且我也只是把c语言的入门教程作一个极其简单的改编而已。 本部分内容改编自c语言中文网中的c语言入门,这个入门教程写得很不错,你也可以随意找一本c语言入门,只看vb没有的那部分章节。 '冬瓜汤改编自c语言中文网的c语言入门 一、1分钟彻底理解指针的概念: 计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 long 占用4个字节,boolean 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。 下图是 4G 内存中每个字节的编号(以十六进制表示): 我们将内存中字节的编号称为 地址(Address) 或 指针(Pointer) 。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。 下面的代码演示了如何输出一个地址: dim as long a =100 dim as String myStr ="这是一个FB入门教程" print "a的地址:" varptr(a) print "myStr的地址:" strptr(mystr) sleep 运行结果: a的地址:1310384 mystr的地址:6164384 FB语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。 数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。 CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。如果程序不小心出错,或者开发者有意为之,在 CPU 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。 CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。 假设变量 a、b、c 在内存中的地址分别是 0X1000、0X2000、0X3000,那么加法运算c = a + b;将会被转换成类似下面的形式: 0X3000 = (0X1000) + (0X2000); ( )表示取值操作,整个表达式的意思是,取出地址 0X1000 和 0X2000 上的值,将它们相加,把相加的结果赋值给地址为 0X3000 的内存 变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。 需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。
个人分类: FreeBasic|5726 次阅读|0 个评论

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2025-5-9 15:04 , Processed in 0.072065 second(s), 14 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部