注冊(cè) 登錄
Office中國論壇/Access中國論壇 返回首頁

ganlinlao的個(gè)人空間 http://m.mzhfr.cn/?230471 [收藏] [復(fù)制] [分享] [RSS]

日志

Freebasic菜鳥初學(xué)Freebasic基礎(chǔ)教程八:Freebasic和VB6(vba)語法差異:

已有 3820 次閱讀2017-5-11 10:01 |個(gè)人分類:FreeBasic

Freebasic和VB6(vba)語法差異:

     (1)字符串是不同的:
             vb6只有一種字符串那就是bstr,bstr是特殊的unicode類型的字符串。
            Freebasic支持三種字符串,zstring(兼容c的char,除了調(diào)用c/c++庫,一般不用),標(biāo)準(zhǔn)
            的string(ascii)不固定長(zhǎng)度,最大2的32次方,wstring(unicode)。zstring和wstring只能使用指針
            ,或固定長(zhǎng)度的字符串。只要是字符串類型,都是指針,不管是vbstring,zstring,string,wstring都
            是指針。
             在FB中zstring和string一般是等同的(其中的非常細(xì)小差別,你可以具體看參考文檔)。wstring用于
             unicode,因?yàn)槭侵形沫h(huán)境,所以wstring我們會(huì)使用得非常頻繁。
             zstring和wstring只能這樣用:
             Dim myWstr As wstring ptr '聲明成指針類型
             mywstr=WSpace(200)  '先分配指針內(nèi)存大小,也就是緩存區(qū)
             然后再開始賦值。
             mywstr="Freebasic入門"
             或者: Dim myWstr As wstring*26  '聲明成定長(zhǎng)的字符串
               myWstr="Freebasic入門"
              
              string則是不定長(zhǎng)的,動(dòng)態(tài)字符串?dāng)?shù)組
              用法和VB中是一樣的:
              Dim  myStr As String
              myStr="Freebasic入門"
              string和wstring類型的轉(zhuǎn)換很簡(jiǎn)單
              myWstr=wstr(mystr),ansii轉(zhuǎn)成unioce類型
              mystr=Str(myWstr),unicode轉(zhuǎn)成ansii
              Str()和Wstr()相當(dāng)于vb中的Cstr()。這兩個(gè)函數(shù)會(huì)使用得相當(dāng)頻繁。
              所有的FB的字符串函數(shù)都同樣適用于string和wstring,沒有區(qū)別。
              FB中l(wèi)en()函數(shù)對(duì)于anscii類型的string,zstring總是返回字符串的字節(jié)大小,和VB中的lenB()是一樣的。
              對(duì)于unicode類型的wstring總是返回字符串中字符的個(gè)數(shù),和vb中的len()是一樣的。             
              FB中沒有l(wèi)ike這樣的關(guān)鍵字,所以如果要進(jìn)行匹配,只能使用正則。

      (2)數(shù)組是不同的。
              vb中的數(shù)組叫safeAarray,安全數(shù)組,這是一個(gè)性能不太高的數(shù)組類型,但它線程安全。
              FB中的數(shù)組就是c的數(shù)組,性能比安全數(shù)組要高很多。
              用法幾乎是一模一樣的。
              FB的數(shù)組:
               Dim  myArr() As Long '動(dòng)態(tài)空數(shù)組,使用時(shí),必須Redim
               或 Dim myArr(2,3) As String  '聲明成固定大小數(shù)組,可直接使用
        
        (3)variant。
            FB中沒有Variant這種類型,所以FB中任何變量都必須要指明數(shù)據(jù)類型
            VB中,你可以這樣寫:
            Dim i,mystr   它們都默認(rèn)成variant,但這在FB中是行不通的。這樣寫編譯器百分百報(bào)錯(cuò)。
            
          (4) 數(shù)字類型
            FB中沒有currency,所以遇到currency,只能使用longint/10000進(jìn)行轉(zhuǎn)換。
            currency和longint一樣,都是8字節(jié)。
            vb中integer表示短整數(shù),而FB中使用short,好在這種類型使用頻率不高,一般用long代替。
            但integer在FB中重要得多了,它是一個(gè)智能指針,在32位中=Long,在64位中=longint
            這相當(dāng)于VBA中的longptr類型,所以如果你要寫32位和64位通用的,一般使用integer
            但如果你需要固定大小的數(shù)據(jù)就使用long或longint,它們不管32位還是64位,大小都是固定的。
            
            (5)全局變量聲明不同
              在vb中聲明全局變量一般是public mystr As String
              vb中的全局一般是指一個(gè)工程。
              但在FB中聲明全局變量要麻煩得多了,用dim share i As long。而且這個(gè)全局變量的范圍
              是指一個(gè)文件,指的是在這個(gè)文件中所有函數(shù)或類,都能使用share定義的公共變量。
              如果超出這個(gè)文件的范圍,必須通用#include引用或在另一個(gè)文件中另外聲明。
              我確實(shí)見過有人把一整個(gè)程序都寫在一個(gè)文件當(dāng)中,這在VB是無法想象的。

             (6)函數(shù)和過程寫法的差別:
                    1) 函數(shù)必須先聲明,然后再定義
                       用慣了VB,你可能覺得很別扭。
                       FB中,一般都先聲明函數(shù)或類,然后再開始寫函數(shù)
                       如: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
                            
                      如果沒有聲明函數(shù),會(huì)出現(xiàn)什么情況呢:
                      FB一個(gè)模塊文件中代碼是從上到下順序執(zhí)行的。如果你要調(diào)用的函數(shù),
                      是寫在本函數(shù)的后面,那么本函數(shù)無法調(diào)用那個(gè)寫在后面的函數(shù),因?yàn)樗琼樞驁?zhí)行的。
                      聲明過的函數(shù),可以隨意調(diào)用任何位置的函數(shù)。而且聲明的函數(shù),最后我們會(huì)把它組織成
                      頭文件,然后在各個(gè)地方調(diào)用。所以函數(shù)(過程)都要先聲明,再寫函數(shù)體。

                      返回函數(shù)值方式有點(diǎn)不一樣:
                       VB只有一種,那就是函數(shù)名=返回值
                       FB有三種,一種和VB是一樣的,函數(shù)名=返回值,一種是function=返回值,第三種是 Return 返回值。
            
                    2) stdcall和cdecl協(xié)議
                      在VB中模塊中所有的函數(shù)或過程,都只能stdcall,你寫不了cdecl,事實(shí)上,你在vb中要
                       調(diào)用cdecl的dll函數(shù),極其不容易。
                       FB支持所有c支持的協(xié)議,當(dāng)然最常用是stdcall和cdecl協(xié)議。
                       在windows上FB默認(rèn)使用stdcall,在linux上默認(rèn)使用cdecl。
                         當(dāng)然你可以顯式指定協(xié)議。
                         Function cdecl add( a As long,b As long) As Long
                   
                    3)  可選參數(shù),命名參數(shù),數(shù)組參數(shù)
                           很不幸,這在VB中很隨意常見的東西,目前在FB中還沒有實(shí)現(xiàn),現(xiàn)在已經(jīng)提上日程,
                           但什么時(shí)候?qū)崿F(xiàn)還未知。
                           FB中使用可選參數(shù),不能使用optional,而是只能使用overload來寫帶可選參數(shù)的函數(shù)
                          FB中目前沒有命名參數(shù) :=這個(gè)目前還無法使用。
                          FB也沒有paramArray這樣的數(shù)組參數(shù)用來表示不確定參數(shù),但FB有不定參數(shù)…,這用法
                          和c是一樣的,只能使用cdecl協(xié)議,不能在stdcall中使用不定參數(shù)。更糟糕的是在64位編
                          譯器中,也沒有實(shí)現(xiàn)不定參數(shù)…,因?yàn)?4位中,不再使用stdcall和cdecl這樣的協(xié)議了。
                           我們只能希望FB能早點(diǎn)實(shí)現(xiàn)optional ,:=,數(shù)組參數(shù)了。
                           當(dāng)然如果你水平夠高的話,F(xiàn)B也是能使用的,通過宏拓展調(diào)用一維數(shù)組,進(jìn)行參數(shù)傳遞
                           optinal,:= 和paramArray都沒有問題。
                   4)   短路邏輯 AndAlso,OrEsle,位操作,位左移,位右移,bit操作,bin二進(jìn)制數(shù)據(jù)類型
                        一般來說FB會(huì)比VB多一些內(nèi)容,也就是底層操作方面會(huì)更細(xì),畢竟FB是兼容c的,
                        這個(gè)在具體使用中慢慢體會(huì)吧。
FB和VB在語法和語義上的差別,以后再慢慢整理吧

評(píng)論 (0 個(gè)評(píng)論)

facelist doodle 涂鴉板

您需要登錄后才可以評(píng)論 登錄 | 注冊(cè)

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-13 03:02 , Processed in 0.063425 second(s), 17 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回頂部