注册 登录
Office中国论坛/Access中国论坛 返回首页

ganlinlao的个人空间 http://www.office-cn.net/?230471 [收藏] [复制] [分享] [RSS]

日志

Freebasic菜鸟初学Freebasic基础教程八:Freebasic和VB6(vba)语法差异:

已有 3485 次阅读2017-5-11 10:01 |个人分类:FreeBasic

Freebasic和VB6(vba)语法差异:

     (1)字符串是不同的:
             vb6只有一种字符串那就是bstr,bstr是特殊的unicode类型的字符串。
            Freebasic支持三种字符串,zstring(兼容c的char,除了调用c/c++库,一般不用),标准
            的string(ascii)不固定长度,最大2的32次方,wstring(unicode)。zstring和wstring只能使用指针
            ,或固定长度的字符串。只要是字符串类型,都是指针,不管是vbstring,zstring,string,wstring都
            是指针。
             在FB中zstring和string一般是等同的(其中的非常细小差别,你可以具体看参考文档)。wstring用于
             unicode,因为是中文环境,所以wstring我们会使用得非常频繁。
             zstring和wstring只能这样用:
             Dim myWstr As wstring ptr '声明成指针类型
             mywstr=WSpace(200)  '先分配指针内存大小,也就是缓存区
             然后再开始赋值。
             mywstr="Freebasic入门"
             或者: Dim myWstr As wstring*26  '声明成定长的字符串
               myWstr="Freebasic入门"
              
              string则是不定长的,动态字符串数组
              用法和VB中是一样的:
              Dim  myStr As String
              myStr="Freebasic入门"
              string和wstring类型的转换很简单
              myWstr=wstr(mystr),ansii转成unioce类型
              mystr=Str(myWstr),unicode转成ansii
              Str()和Wstr()相当于vb中的Cstr()。这两个函数会使用得相当频繁。
              所有的FB的字符串函数都同样适用于string和wstring,没有区别。
              FB中len()函数对于anscii类型的string,zstring总是返回字符串的字节大小,和VB中的lenB()是一样的。
              对于unicode类型的wstring总是返回字符串中字符的个数,和vb中的len()是一样的。             
              FB中没有like这样的关键字,所以如果要进行匹配,只能使用正则。

      (2)数组是不同的。
              vb中的数组叫safeAarray,安全数组,这是一个性能不太高的数组类型,但它线程安全。
              FB中的数组就是c的数组,性能比安全数组要高很多。
              用法几乎是一模一样的。
              FB的数组:
               Dim  myArr() As Long '动态空数组,使用时,必须Redim
               或 Dim myArr(2,3) As String  '声明成固定大小数组,可直接使用
        
        (3)variant。
            FB中没有Variant这种类型,所以FB中任何变量都必须要指明数据类型
            VB中,你可以这样写:
            Dim i,mystr   它们都默认成variant,但这在FB中是行不通的。这样写编译器百分百报错。
            
          (4) 数字类型
            FB中没有currency,所以遇到currency,只能使用longint/10000进行转换。
            currency和longint一样,都是8字节。
            vb中integer表示短整数,而FB中使用short,好在这种类型使用频率不高,一般用long代替。
            但integer在FB中重要得多了,它是一个智能指针,在32位中=Long,在64位中=longint
            这相当于VBA中的longptr类型,所以如果你要写32位和64位通用的,一般使用integer
            但如果你需要固定大小的数据就使用long或longint,它们不管32位还是64位,大小都是固定的。
            
            (5)全局变量声明不同
              在vb中声明全局变量一般是public mystr As String
              vb中的全局一般是指一个工程。
              但在FB中声明全局变量要麻烦得多了,用dim share i As long。而且这个全局变量的范围
              是指一个文件,指的是在这个文件中所有函数或类,都能使用share定义的公共变量。
              如果超出这个文件的范围,必须通用#include引用或在另一个文件中另外声明。
              我确实见过有人把一整个程序都写在一个文件当中,这在VB是无法想象的。

             (6)函数和过程写法的差别:
                    1) 函数必须先声明,然后再定义
                       用惯了VB,你可能觉得很别扭。
                       FB中,一般都先声明函数或类,然后再开始写函数
                       如:declare Function add( a As long,b As Long ) As Long
                        然后开始写
                             Function add( a As Long ,b As Long ) As Long
                                function=a+b
                            End Function
                            
                      如果没有声明函数,会出现什么情况呢:
                      FB一个模块文件中代码是从上到下顺序执行的。如果你要调用的函数,
                      是写在本函数的后面,那么本函数无法调用那个写在后面的函数,因为它是顺序执行的。
                      声明过的函数,可以随意调用任何位置的函数。而且声明的函数,最后我们会把它组织成
                      头文件,然后在各个地方调用。所以函数(过程)都要先声明,再写函数体。

                      返回函数值方式有点不一样:
                       VB只有一种,那就是函数名=返回值
                       FB有三种,一种和VB是一样的,函数名=返回值,一种是function=返回值,第三种是 Return 返回值。
            
                    2) stdcall和cdecl协议
                      在VB中模块中所有的函数或过程,都只能stdcall,你写不了cdecl,事实上,你在vb中要
                       调用cdecl的dll函数,极其不容易。
                       FB支持所有c支持的协议,当然最常用是stdcall和cdecl协议。
                       在windows上FB默认使用stdcall,在linux上默认使用cdecl。
                         当然你可以显式指定协议。
                         Function cdecl add( a As long,b As long) As Long
                   
                    3)  可选参数,命名参数,数组参数
                           很不幸,这在VB中很随意常见的东西,目前在FB中还没有实现,现在已经提上日程,
                           但什么时候实现还未知。
                           FB中使用可选参数,不能使用optional,而是只能使用overload来写带可选参数的函数
                          FB中目前没有命名参数 :=这个目前还无法使用。
                          FB也没有paramArray这样的数组参数用来表示不确定参数,但FB有不定参数…,这用法
                          和c是一样的,只能使用cdecl协议,不能在stdcall中使用不定参数。更糟糕的是在64位编
                          译器中,也没有实现不定参数…,因为64位中,不再使用stdcall和cdecl这样的协议了。
                           我们只能希望FB能早点实现optional ,:=,数组参数了。
                           当然如果你水平够高的话,FB也是能使用的,通过宏拓展调用一维数组,进行参数传递
                           optinal,:= 和paramArray都没有问题。
                   4)   短路逻辑 AndAlso,OrEsle,位操作,位左移,位右移,bit操作,bin二进制数据类型
                        一般来说FB会比VB多一些内容,也就是底层操作方面会更细,毕竟FB是兼容c的,
                        这个在具体使用中慢慢体会吧。
FB和VB在语法和语义上的差别,以后再慢慢整理吧

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

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

GMT+8, 2024-3-29 12:42 , Processed in 0.064018 second(s), 17 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部