Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開始

tag 標(biāo)簽: FreeBasic基礎(chǔ)教程

相關(guān)帖子

版塊 作者 回復(fù)/查看 最后發(fā)表

沒(méi)有相關(guān)內(nèi)容

相關(guān)日志

分享 Freebasic菜鳥初學(xué)Freebasic基礎(chǔ)教程三:帶參數(shù)的宏定義
ganlinlao 2017-5-8 17:43
FB語(yǔ)言允許宏帶有參數(shù)。在宏定義中的參數(shù)稱為形式參數(shù),在宏調(diào)用中的參數(shù)稱為實(shí)際參數(shù),這點(diǎn)和函數(shù)有些類似。 '冬瓜湯改編自c語(yǔ)言中文網(wǎng)c語(yǔ)言基礎(chǔ)入門 對(duì)帶參數(shù)的宏,在調(diào)用中,不僅要宏展開,而且要用實(shí)參去代換形參。 帶參宏定義的一般形式為: #define 宏名(形參列表) 字符串 在字符串中含有各個(gè)形參。 帶參宏調(diào)用的一般形式為: 宏名(實(shí)參列表); 例如: #define M(y) y*y+3*y '宏定義 '// Code k=M(5); //宏調(diào)用 在宏調(diào)用時(shí),用實(shí)參5去代替形參y,經(jīng)預(yù)處理宏展開后的語(yǔ)句為k=5*5+3*5。 【示例】輸出兩個(gè)數(shù)中較大的數(shù)。 #define MAX(a,b) iif(ab, a , b) Dim As long x,y,myMax input "請(qǐng)輸入一個(gè)數(shù)字: " ,x Input "請(qǐng)輸入另一個(gè)數(shù)字:" ,y myMax = MAX(x, y) print myMax sleep 運(yùn)行結(jié)果: 輸入兩個(gè)數(shù)字: 10 20 max=20 程序第2行進(jìn)行了帶參宏定義,用宏名MAX表示條件表達(dá)式iif(ab, a , b),形參a、b均出現(xiàn)在條件表達(dá)式中。程序第7行myMax=MAX(x, y)為宏調(diào)用,實(shí)參 x、y 將代換形參a、b。宏展開后該語(yǔ)句為: max=iif(xy, x , y) 對(duì)帶參宏定義的說(shuō)明 1) 帶參宏定義中,形參之間可以出現(xiàn)空格,但是宏名和形參列表之間不能有空格出現(xiàn)。例如把: #define MAX(a,b) iif(ab, a , b) 寫為: #define MAX (a,b) iif(ab, a , b) 將被認(rèn)為是無(wú)參宏定義,宏名MAX代表字符串(a,b) iif(ab, a , b)。宏展開時(shí),宏調(diào)用語(yǔ)句: max=MAX(x,y); 將變?yōu)椋?max=(a,b)iif(ab, a , b)(x,y) 這顯然是錯(cuò)誤的。 2) 在帶參宏定義中,不會(huì)為形式參數(shù)分配內(nèi)存,因此不必指明數(shù)據(jù)類型。而在宏調(diào)用中,實(shí)參包含了具體的數(shù)據(jù),要用它們?nèi)ゴ鷵Q形參,因此必須指明數(shù)據(jù)類型。 這一點(diǎn)和函數(shù)是不同的:在函數(shù)中,形參和實(shí)參是兩個(gè)不同的變量,都有自己的作用域,調(diào)用時(shí)要把實(shí)參的值傳遞給形參;而在帶參數(shù)的宏中,只是符號(hào)的替換,不存在值傳遞的問(wèn)題。 【示例】輸入 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 運(yùn)行結(jié)果: input a number: 9 sq=100 第2行為宏定義,形參為 y。第7行宏調(diào)用中實(shí)參為 a+1,是一個(gè)表達(dá)式,在宏展開時(shí),用 a+1 代換 y,再用 (y)*(y) 代換 SQ,得到如下語(yǔ)句: sq=(a+1)*(a+1); 這與函數(shù)的調(diào)用是不同的,函數(shù)調(diào)用時(shí)要把實(shí)參表達(dá)式的值求出來(lái)再傳遞給形參,而宏展開中對(duì)實(shí)參表達(dá)式不作計(jì)算,直接按照原樣替換。 3) 在宏定義中,字符串內(nèi)的形參通常要用括號(hào)括起來(lái)以避免出錯(cuò)。例如上面的宏定義中 (y)*(y) 表達(dá)式的 y 都用括號(hào)括起來(lái),因此結(jié)果是正確的。如果去掉括號(hào),把程序改為以下形式: #define SQ(y) y*y Dim As Long a, sq; input "input a number: ",a sq = SQ(a+1); print "sq=" + sq 運(yùn)行結(jié)果為: input a number: 9 sq=19 同樣輸入9,但結(jié)果卻是不一樣的。問(wèn)題在哪里呢?這是由于替換只作符號(hào)替換而不作其它處理而造成的。宏替換后將得到以下語(yǔ)句: sq=a+1*a+1; 由于a為9故sq的值為19。這顯然與題意相違,因此參數(shù)兩邊的括號(hào)是不能少的。即使在參數(shù)兩邊加括號(hào)還是不夠的,請(qǐng)看下面程序: #define SQ(y) (y)*(y) Dim As Long a, sq; input "input a number: ",a sq = 200/SQ(a+1); print "sq=" + sq 與前面的代碼相比,只是把宏調(diào)用語(yǔ)句改為: sq=200/SQ(a+1); 運(yùn)行程序后,如果仍然輸入 9,那么我們希望的結(jié)果為 2。但實(shí)際情況并非如此: input a number: 9 sq=200 為什么會(huì)得這樣的結(jié)果呢?分析宏調(diào)用語(yǔ)句,在宏展開之后變?yōu)椋?sq=200/(a+1)*(a+1); a 為 9 時(shí),由于“/”和“*”運(yùn)算符優(yōu)先級(jí)和結(jié)合性相同,所以先計(jì)算 200/(9+1),結(jié)果為 20,再計(jì)算 20*(9+1),最后得到 200。 為了得到正確答案,應(yīng)該在宏定義中的整個(gè)字符串外加括號(hào): #define SQ(y) ((y)*(y)) Dim As Long a, sq; input "input a number: ",a sq = 200/SQ(a+1); print "sq=" + sq 由此可見, 對(duì)于帶參宏定義不僅要在參數(shù)兩側(cè)加括號(hào),還應(yīng)該在整個(gè)字符串外加括號(hào)。 帶參數(shù)的宏和函數(shù)很相似,但有本質(zhì)上的區(qū)別: 宏展開僅僅是字符串的替換,不會(huì)對(duì)表達(dá)式進(jìn)行計(jì)算;宏在編譯之前就被處理掉了,它沒(méi)有機(jī)會(huì)參與編譯,也不會(huì)占用內(nèi)存。而函數(shù)是一段可以重復(fù)使用的代碼,會(huì)被編譯,會(huì)給它分配內(nèi)存,每次調(diào)用函數(shù),就是執(zhí)行這塊內(nèi)存中的代碼。
個(gè)人分類: FreeBasic|2699 次閱讀|0 個(gè)評(píng)論
分享 Freebasic菜鳥初學(xué)Freebasic基礎(chǔ)教程一:一分鐘理解指針
ganlinlao 2017-5-8 10:04
Freebasic菜鳥初學(xué)Freebasic基礎(chǔ)教程一:一分鐘理解指針
Freebsic是一門沒(méi)有任何特點(diǎn)的開源語(yǔ)言,非常平庸。它是披著VB的語(yǔ)法羊皮,長(zhǎng)著一顆c語(yǔ)言的心,懷著c++的情懷,卻生在一個(gè)托管語(yǔ)言橫行的世界。所以本系列文章,謹(jǐn)此獻(xiàn)給極其少數(shù)幾個(gè)喜歡Freebasic的人。 freebasic的語(yǔ)法和vb是極其相似的,所以如果你有vb6或vba的基礎(chǔ)的話,那么你用Freebasic寫代碼幾乎沒(méi)有任何障礙,非常熟悉,如果你有點(diǎn)c語(yǔ)言基礎(chǔ)的話,你馬上就可以使用Freebasic,F(xiàn)reebasic和c是高度兼容的,而且可以使用gcc或LLvm編譯。本系列適用于有點(diǎn)VB基礎(chǔ)的人看,而且我也只是把c語(yǔ)言的入門教程作一個(gè)極其簡(jiǎn)單的改編而已。 本部分內(nèi)容改編自c語(yǔ)言中文網(wǎng)中的c語(yǔ)言入門,這個(gè)入門教程寫得很不錯(cuò),你也可以隨意找一本c語(yǔ)言入門,只看vb沒(méi)有的那部分章節(jié)。 '冬瓜湯改編自c語(yǔ)言中文網(wǎng)的c語(yǔ)言入門 一、1分鐘徹底理解指針的概念: 計(jì)算機(jī)中所有的數(shù)據(jù)都必須放在內(nèi)存中,不同類型的數(shù)據(jù)占用的字節(jié)數(shù)不一樣,例如 long 占用4個(gè)字節(jié),boolean 占用1個(gè)字節(jié)。為了正確地訪問(wèn)這些數(shù)據(jù),必須為每個(gè)字節(jié)都編上號(hào)碼,就像門牌號(hào)、身份證號(hào)一樣,每個(gè)字節(jié)的編號(hào)是唯一的,根據(jù)編號(hào)可以準(zhǔn)確地找到某個(gè)字節(jié)。 下圖是 4G 內(nèi)存中每個(gè)字節(jié)的編號(hào)(以十六進(jìn)制表示): 我們將內(nèi)存中字節(jié)的編號(hào)稱為 地址(Address) 或 指針(Pointer) 。地址從 0 開始依次增加,對(duì)于 32 位環(huán)境,程序能夠使用的內(nèi)存為 4GB,最小的地址為 0,最大的地址為 0XFFFFFFFF。 下面的代碼演示了如何輸出一個(gè)地址: dim as long a =100 dim as String myStr ="這是一個(gè)FB入門教程" print "a的地址:" varptr(a) print "myStr的地址:" strptr(mystr) sleep 運(yùn)行結(jié)果: a的地址:1310384 mystr的地址:6164384 FB語(yǔ)言用變量來(lái)存儲(chǔ)數(shù)據(jù),用函數(shù)來(lái)定義一段可以重復(fù)使用的代碼,它們最終都要放到內(nèi)存中才能供 CPU 使用。 數(shù)據(jù)和代碼都以二進(jìn)制的形式存儲(chǔ)在內(nèi)存中,計(jì)算機(jī)無(wú)法從格式上區(qū)分某塊內(nèi)存到底存儲(chǔ)的是數(shù)據(jù)還是代碼。當(dāng)程序被加載到內(nèi)存后,操作系統(tǒng)會(huì)給不同的內(nèi)存塊指定不同的權(quán)限,擁有讀取和執(zhí)行權(quán)限的內(nèi)存塊就是代碼,而擁有讀取和寫入權(quán)限(也可能只有讀取權(quán)限)的內(nèi)存塊就是數(shù)據(jù)。 CPU 只能通過(guò)地址來(lái)取得內(nèi)存中的代碼和數(shù)據(jù),程序在執(zhí)行過(guò)程中會(huì)告知 CPU 要執(zhí)行的代碼以及要讀寫的數(shù)據(jù)的地址。如果程序不小心出錯(cuò),或者開發(fā)者有意為之,在 CPU 要寫入數(shù)據(jù)時(shí)給它一個(gè)代碼區(qū)域的地址,就會(huì)發(fā)生內(nèi)存訪問(wèn)錯(cuò)誤。這種內(nèi)存訪問(wèn)錯(cuò)誤會(huì)被硬件和操作系統(tǒng)攔截,強(qiáng)制程序崩潰,程序員沒(méi)有挽救的機(jī)會(huì)。 CPU 訪問(wèn)內(nèi)存時(shí)需要的是地址,而不是變量名和函數(shù)名!變量名和函數(shù)名只是地址的一種助記符,當(dāng)源文件被編譯和鏈接成可執(zhí)行程序后,它們都會(huì)被替換成地址。編譯和鏈接過(guò)程的一項(xiàng)重要任務(wù)就是找到這些名稱所對(duì)應(yīng)的地址。 假設(shè)變量 a、b、c 在內(nèi)存中的地址分別是 0X1000、0X2000、0X3000,那么加法運(yùn)算c = a + b;將會(huì)被轉(zhuǎn)換成類似下面的形式: 0X3000 = (0X1000) + (0X2000); ( )表示取值操作,整個(gè)表達(dá)式的意思是,取出地址 0X1000 和 0X2000 上的值,將它們相加,把相加的結(jié)果賦值給地址為 0X3000 的內(nèi)存 變量名和函數(shù)名為我們提供了方便,讓我們?cè)诰帉懘a的過(guò)程中可以使用易于閱讀和理解的英文字符串,不用直接面對(duì)二進(jìn)制地址,那場(chǎng)景簡(jiǎn)直讓人崩潰。 需要注意的是,雖然變量名、函數(shù)名、字符串名和數(shù)組名在本質(zhì)上是一樣的,它們都是地址的助記符,但在編寫代碼的過(guò)程中,我們認(rèn)為變量名表示的是數(shù)據(jù)本身,而函數(shù)名、字符串名和數(shù)組名表示的是代碼塊或數(shù)據(jù)塊的首地址。
個(gè)人分類: FreeBasic|5749 次閱讀|0 個(gè)評(píng)論

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

GMT+8, 2025-7-13 07:41 , Processed in 0.059196 second(s), 14 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回頂部