痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 10632|回復: 10

沈大胖的MCU入門學習之路---02.C語言學習環境建置篇

[複製鏈接]
發表於 2014-7-19 00:50:49 | 顯示全部樓層 |閱讀模式
本帖最後由 fatzeros 於 2014-7-19 08:33 AM 編輯

前篇:
沈大胖的MCU入門學習之路---01.程式語言

要學習C語言,就必須要先了解相關的工具,來幫助我們學習,
接下來,大胖會告訴大家,怎麼樣在自己的電腦上建置撰寫C語言的環境。

首先簡單的說明一下,從程式原始碼到可執行檔的建立流程:
①撰寫程式的原始碼,也就是撰寫「xxx.c」附檔名為c的純文字原始碼檔案
②使用編譯器將c原始碼編譯出「xxx.o」或是「xxx.obj」的object檔,這個檔案一般來說是目標檔了
③使用linker鍵結object檔並輸出為可執行檔
簡單的來說有以上三個步驟。

相關網路資源:
http://lalakiwe.sg1006.myweb.hin ... MakefileSummary.pdf
http://shukaiyang.myweb.hinet.net/cpp/concept.zhtw.htm

由於再怎麼簡單還是要有幾個步驟要作,那麼有沒有再更簡單的作法呢?
大胖容易肚子餓,有沒有只要按個按鍵就可以輸出可執行檔呢?
有的,使用IDE(Integrated Development Environment,簡稱為IDE,
也稱為Integration Design Environment或是Integration Debugging Environment)
http://zh.wikipedia.org/wiki/%E9 ... 1%E7%8E%AF%E5%A2%83
也就是使用整合的開發環境來幫助程式開發人員進行開發。

接下來,我會介紹大胖目前使用IDE,基於網路的發達,大胖一向以來都愛吃免錢的,
所以,會使用免費開放或是GNU版權的軟體,大家不用擔心學習程式語言還要花一筆費用買軟體,
只要你有一台堪用的個人電腦及WINDOWS作業系統就行了。

評分

9

查看全部評分

 樓主| 發表於 2014-7-19 00:50:50 | 顯示全部樓層
本帖最後由 fatzeros 於 2014-7-21 11:35 AM 編輯

接下來,大胖會介紹Dev C++這套IDE,
這套IDE有兩個版本,原開發者在4.9.9.2這個版本之後就停止開發了,原始開發者的網站:http://www.bloodshed.net/
但是,感謝網路上的好心人,有接下去更新了,新開發者的網站:http://orwelldevcpp.blogspot.tw/
目前的版本是:Version 5.6.3 - 4 May 2014
在網路上你可能會看到這幾篇文章:https://www.google.com.tw/search ... _sm=93&ie=UTF-8

大意是說,請你不要使用Dev C++來進行開發的動作,
主因是因為舊版的Dev C++已停止更新了,所以他使用的編譯器是比較舊的,
但是,我們目前只是學習及寫寫小程式,對我們來說更新版之後的Dev C++這套就很好用了,
除非你是要再進行更深入的開發,要不然,大胖覺得目前這套IDE就很好用了!

由於Dev C++已整合了文字編輯器、編譯器、及除錯環境,
所以只要安裝這套IDE就可以撰寫簡單的小程式了,
以下,將從安裝流程到撰寫除錯,作簡單的介紹:

一、下載:
先到新開發者的網站:http://orwelldevcpp.blogspot.tw/
然後在Download的這邊,有安裝檔及免安裝檔可以使用,
建議還是下載使用安裝檔:
PIC-1.png
其他的版本是64位元及無編譯器版本的,我們目前用不到!

大家可以看到MinGW32 4.8.1這個關鍵字,這個就是目前Dev C++使用的編輯器版本,
有關於MinGW可以參考這裡:
http://www.mingw.org/
http://zh.wikipedia.org/wiki/MinGW

二、安裝:
打開下載好的檔案,一開始檔案會先進行解壓縮的動作
圖片 001.png

再來,我們可以選擇安裝介面的語言選項,由於裡面沒有中文,直接選English後,按OK就行了
圖片 002.png

接下來是版權及使用權宣告,直接按I Agree就行了
圖片 003.png

再來是安裝的選項,如沒有要太多的自定選項的話,建議按Next過去,
這裡要注意一下,硬碟要留大約650mb的容量
圖片 004.png

再來是要不要自訂安裝的資料夾位置,請使用預設位置,按Install過去
圖片 005.png

安裝中,請稍候
圖片 006.png

裝好了,請按Finish結束安裝流程,並開啟Dev C++
圖片 007.png

接下來是編輯器的介面設定,這裡就有Chinese(TW)中文介面可以選啦,選好後按Next繼續
圖片 008.png

這裡可以自訂編輯器的字型和顯示方式,大家可以自己修改看看,改成自己覺得最舒服的介面,
然後可以在左手邊的編輯器介面預覽區看到修改後的樣子,按下一步繼續,
有關編輯器的設定部份,之後在主介面還是可以由「工具」--->「編輯器選項」內變更
圖片 009.png

在這裡,大胖使用的是anonymous pro這個字型,
這套字型是專門設計給程設人員使用的固定寬度字型,
為什會使用這套字型呢?
主要是因為,在英數字中,0Oo1lI有可能會造成閱讀上的混淆,
使用這套字型可以很清楚的區分字母,在設定某些參數時比較容易區分,字體也比較好看,
這套字型也是開放使用的,網站最下方可以下載:http://www.marksimonson.com/fonts/view/anonymous-pro

再來這裡是建立標頭檔(header file)的快取,請按下一步繼續
圖片 010.png

好了,編輯器的介面已自訂完成啦,按下OK後進入主介面了
圖片 011.png

評分

1

查看全部評分

 樓主| 發表於 2014-7-19 00:50:51 | 顯示全部樓層
本帖最後由 fatzeros 於 2014-7-19 12:53 AM 編輯

三、撰寫及編譯
接下來開啟Dev C++的主視窗
圖片 012.png

主要的畫面是長這個樣子
devc- 001.png

再來就要進入主題了,我們可以開始寫我們的第一支程式了,
從「檔案」--->「開新檔案」--->「專案」開始
devc- 002.png

在建立新專案的視窗,我們先選擇「Console Application」
並選取C專案,然後再給這個專案一個名稱,名稱還是儘量以英文檔名為主,以避免編碼上的問題,
然後再按「確定」就行了
devc- 003.png

再來,要找個目錄給這個專案來住,一樣還是儘量以英文路徑為主
devc- 004.png

Dev C++就會幫我們建立一個專案,並把主要的原始碼「main.c」這個檔案建立出來,並且也加上了部份程式碼,
我們這個時候來細看一下Dev C++的主要介面分區,
由上至下,可分為「工具列」、「專案管理區」、「編輯區」及「編譯除錯訊息區」
devc- 005.png

再來,我們來寫一個全世界最知名的小小程式,「Hello World」,程式碼只有七行,
這支程式的功能就是在console介面印出「Hello World !」這一行字
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void main(void)
  4. {
  5.         printf("Hello World !") ;
  6. }
複製代碼
devc- 006.png

我們已經寫好了,我們的第一個小程式,千萬要記得存檔,再來就是要編譯程式,並輸出可執行檔,
從「執行」--->「編譯」或是按快速鍵「F9」,就可以編譯這支程式了
devc- 007.png

編譯完後,我們可以在「編譯除錯訊息區」的「編譯紀錄」裡看到這次編譯的相關訊息,
只要注意最後一行是否有編譯成功就行了
devc- 008.png

假如編譯不成功的話,會在「編譯器訊息」出現相關的錯誤訊息,
這裡是告訴我們在main函數裡,第七行第一列的"}"符號前沒有C語言的斷行符號";"的語法錯誤,
所以輸出main.o檔失敗,使用IDE的好處就是在這裡,他會把編譯的相關訊息整理後告訴我們,以達成簡易的除錯
devc- 012.png

修正錯誤後,假若編譯成功的話,我們可以在放專案的資料夾裡看到生出好多其他的檔案
最重要的就是demo1.exe這支可執行檔啦
devc- 009.png

再來就是執行demo1.exe這支執行檔看看是否正常啦,
可以從「執行」--->「執行」或是按快速鍵「F10」,來執行輸出的可執行檔,
如果直接執行demo1.exe的話,應該只會看到一個黑色的視窗一閃而過而已,
主要是因為這是一支console執行檔,在WINDOWS系統裡,執行他只會一閃而過而已
devc- 013.png

然後就可以看到執行的視窗啦,
沒錯,是我們要的「Hello World !」
devc- 011.png

也可以自己叫出cmd然後執行demo1.exe
devc- 010.png

到這裡,我們就已經學會了,如何使用Dev C++來撰寫一支小程式,並編譯執行了,
再接下來,大胖要簡單的介紹如何使用Dev C++除錯功能,來幫助我們在撰寫程式上找出原始碼的錯誤。

最後附上demo1專案檔: demo1.zip (2.4 KB, 下載次數: 14)
 樓主| 發表於 2014-7-19 00:50:52 | 顯示全部樓層
本帖最後由 fatzeros 於 2014-7-19 12:54 AM 編輯

四、除錯模式
接下來,大胖要簡單的介紹一下除錯模式,
除錯模式可以幫助我們在長長的程式碼中快速的驗證及找出我們覺得會出錯的部份,
我們先來看一下範例程式的部分:
/*-----------------------------------------------
  名稱:demo2
  編寫:沈大胖
  日期:2014/07/18
  修改:
  題目:     模擬一個球在一個盒子裡碰撞的情形。我們假設
                  有一個球在一個寬度為x高度為y的盒子內移動。
                這個球有一個初始位置,表示為(x1,y1)。這個
                球的移動方向為(dx1,dy1),且移動方向均為45度
                角,因此所有的dx和dy均為1或-1。球的移動速度
                是一秒鐘在兩個座標移動一單位長。例如(x1,y1)
                為(3,4)且(dx1,dy1)為(-1,1),則一秒鐘後球將
                移動到(2,5)。

                球撞到盒子邊角時會反彈,由於球始絡以45度角
                移動,所以很容易計算路徑。假設(x1,y1)為(3,4)
                ,(dx1,dy1)為(-1,1),模擬十秒那麼球的位置將
                會是(3,4)、(2,5)、(1,6)、(0,7)、(1,8)、(2,7)、
                (3,6)、(4,5)、(5,4)、(4,3)、(3,2)…等。如果
                球撞到到角落,它會以相反的方向彈回來。

                輸入依序為x、y、x1、y1、dx1、dy1、t,而t是
                需要模擬的秒數。輸出是最後這兩個球的位置。

  內容:
  參閱:
-----------------------------------------------*/

題目的意思是說模擬一個球在一個寬為5(x)高為8(y)的盒子裡移動,
球的初始位置是(3,4)(x1,y1),球移動的方向為(-1,1)(dx1,dy1),
模擬移動的時間為10(t)秒,假設球移動的方向均為45度,每一秒鐘在座標上移動一個單位長,
球撞到盒子的邊角時會反彈,求算出球移動10秒的路徑為何?
就大胖在紙上鬼畫符後的結果,球移動的路徑應為:
(3,4)、(2,5)、(1,6)、(0,7)、(1,8)、(2,7)、(3,6)、(4,5)、(5,4)、(4,3)、(3,2)

接下來請看大胖寫的程式碼:
  1. /*-----------------------------------------------
  2.   名稱:demo2
  3.   編寫:沈大胖
  4.   日期:2014/07/18
  5.   修改:
  6.   題目:模擬一個球在一個盒子裡碰撞的情形。我們假設
  7.                   有一個球在一個寬度為x高度為y的盒子內移動。
  8.                 這個球有一個初始位置,表示為(x1,y1)。這個
  9.                 球的移動方向為(dx1,dy1),且移動方向均為45度
  10.                 角,因此所有的dx和dy均為1或-1。球的移動速度
  11.                 是一秒鐘在兩個座標移動一單位長。例如(x1,y1)
  12.                 為(3,4)且(dx1,dy1)為(-1,1),則一秒鐘後球將
  13.                 移動到(2,5)。

  14.                 球撞到盒子邊角時會反彈,由於球始絡以45度角
  15.                 移動,所以很容易計算路徑。假設(x1,y1)為(3,4)
  16.                 ,(dx1,dy1)為(-1,1),模擬十秒那麼球的位置將
  17.                 會是(3,4)、(2,5)、(1,6)、(0,7)、(1,8)、(2,7)、
  18.                 (3,6)、(4,5)、(5,4)、(4,3)、(3,2)…等。如果
  19.                 球撞到到角落,它會以相反的方向彈回來。

  20.                 輸入依序為x、y、x1、y1、dx1、dy1、t,而t是
  21.                 需要模擬的秒數。輸出是最後這兩個球的位置。

  22.   內容:
  23.   參閱:
  24. -----------------------------------------------*/

  25. #include <stdio.h>                //導入標準I/O函數
  26. #include <stdlib.h>

  27. void main(void)
  28. {
  29.         int x=5 , y=8 ;     //定盒子的寬為5及高為8
  30.         int x1=3 , y1=4 ;   //定球的初始位置為(3,4)
  31.         int dx1=-1 , dy1=1 ;//定球的移動方向為(-1,1)
  32.         int t=10 ;          //定模擬的時間為10秒

  33.         int RunBall(int *x1 , int *y1 , int *dx1 , int *dy1) ;
  34.        //球移動子函數宣告
  35.         int BallDirection(int x , int y , int *x1 , int *y1 , int *dx1 , int *dy1) ;
  36.         //球移動方向子函數宣告

  37.         for(t = 0 ; t <= 10 ; t++)      //設定模擬時間迴圈
  38.         {
  39.                 printf("in loop x1,y1 = (%d,%d) \t and t = %d\n" , x1 , y1 , t) ;
  40.                 //印出迴圈內球的位置及模擬時間
  41.                 printf("dx1,dy1 = (%d,%d) \n" , dx1 , dy1) ;      //印出球的方向

  42.                 BallDirection(x , y , &x1 , &y1 , &dx1 , &dy1) ;    //呼叫球移動方向子函數
  43.         }

  44.         printf("\n程式結束") ;
  45. }

  46. int RunBall(int *x1 , int *y1 , int *dx1 , int *dy1)
  47. {       //計算球移動方式
  48.         *x1 = *x1 + *dx1 ;
  49.         *y1 = *y1 + *dy1 ;
  50. }

  51. BallDirection(int x , int y , int *x1 , int *y1 , int *dx1 , int *dy1)
  52. {       //計算球動的方向及位置
  53.                 if(*x1 == 0)
  54.                 {
  55.                         *dx1 = -1 ;
  56.                         RunBall(x1 , y1 , dx1 , dy1) ;
  57.                 }

  58.                 else if(*x1 == x)
  59.                 {
  60.                         *dx1 = -1 ;
  61.                         RunBall(x1 , y1 , dx1 , dy1) ;
  62.                 }

  63.                 else if(*y1 == 0)
  64.                 {
  65.                         *dy1 = 1 ;
  66.                         RunBall(x1 , y1 , dx1 , dy1) ;
  67.                 }

  68.                 else if(*y1 == y)
  69.                 {
  70.                         *dy1 = -1 ;
  71.                         RunBall(x1 , y1 , dx1 , dy1) ;
  72.                 }

  73.                 else
  74.                         {RunBall(x1 , y1 , dx1 , dy1) ;}
  75. }
複製代碼
大胖先來分析一下我寫的程式:
首先,在main函數先定出題目所需要的變數及訂出初值,於程式碼的第34至37行,
再來,在第39及第41行先宣告RunBall(球移動子函數)及BallDirection(球移動方向子函數),
這二個子函數就是球移動及判定球移動方向的子程式,也是我認為最有可能出錯的地方,
最後就是在main函數內執行一個for迴圈(第44至第51行),執行依秒數的增加呼叫BallDirection子函數,
來判定球移動及移動方向的主迴圈,
另外在迴圈內增加印出目前各變數值的函數(第46及第48行),也是在程式寫作中除錯的一種好方式,
待程式都正常之後就可以移除了。

我們先把程式編譯後執行一遍得出的結果如下
圖片 001.png

哇,在第4秒的地方出錯,球不可能會移動到(-1,8)的地方啊!這樣就跑出盒子外了啊!
所以,我在球移動方向的判定上錯了,那麼,我們要怎麼使用Dev C++來除錯呢?
首先,先在編輯區有疑問的程式碼的行號的地方左點一下或按一下快速鍵(F4)新增/移除中斷點,
就會在行號的地方出現一個小小紅底綠勾,這個就是設定中斷點的意思,當程式執行到這裡的時候,IDE就會暫停,
圖片 002.png

大胖在主函數main的第44行執行for迴圈的地方,
及子函數BallDirection的第66、72、78、84及第89行,
也就是我判定球移動到了邊界時,改變方向的地方設定了中斷點,
當程式在除錯模式時跑到了這裡的時候就會停下來,
我的中斷點都是下在變數有變動的地方,這樣比較方便看出變數變動後差異,
再來就是要「新增監看式」,在「編譯除錯訊區」的除錯區中,按下「新增監看式」,就可以新增想要監看的變數
圖片 003-01.png
圖片 004.png

大胖新增了x1,y1,t,dx1及dy1這幾個我想要監看的變數,可以在「專案管理區」的「除錯」頁裡看到這些被新增的變數,
一開始程式尚未執行,所以變數也尚未給定初值,所以出現「Execute to evaluate」是正常的
圖片 005.png

接下來,大胖就要進行除錯了,永遠記得在除錯前要先存檔一下,讓IDE可以更新原始碼 ,
再來按下「除錯區」的「除錯」按鍵
圖片 003-02.png

這時IDE會重新編譯一次後進入除錯模式,IDE將會停在我們剛才設定的第一個中斷點,
行號的紅底綠勾也變成了藍色的箭頭,
我設定的第一個中斷點是第44行,旁邊的變數也都給定初值了,且第44行尚末被執行
圖片 20.png

再來,我們可以按下「逐行執行」,執行接下來的程式,直到我們發現變數異常了
圖片 003-03.png
圖片 013.png

大胖發現在t=3的時候,且要再進入下一個迴圈的時候,球的位置(x1,y1)錯了,
所以問題就發生在上一個變數改變的時候,這時我們可以先「中斷執行」,然後再重新除錯一次,
並小心的記下問題發生點,就是以下這裡當x1==0的時候,*dx1的值變更為-1
圖片 003-04.png
圖片 012.png

這時,我們可以再新增一個監看式,把*dx1加入監看,並再按一次「逐行執行」將程式先執行第65行,
然後,我們可以在新增的*dx1上按右鍵並「修改數值」, 將*dx1的數值修改為1
圖片 29.png

接下來再次「逐行執行」,這次球的位置(x1,y1)就正確了
圖片 30.png

然後我們就可以斷定原程式的第65行錯了,應該將-1改正為1後,再存檔重新編譯一次,執行後的結果就正確了
圖片 016.png

以上,就是Dev C++的簡易除錯用法,當然除錯模式還有許多其他的功能,這個就得靠大家自行去發掘了!
當然,大胖也是初學者,如果以上有任何的錯誤及觀念不正確的地方,還望請各位老師不吝指教啊!
謝謝謝謝!

到這裡,就是C語言學習環境的簡易建置及使用,希望大家能看得懂,Dev C++這套IDE還有許多功能還沒使用到,
也希望大家能自行學習玩玩看!

接下來,等大胖休息研究一陣子後,就要進入到MCS-51系列的簡易入門介紹了!

最後附上demo2專案檔: demo2.zip (54.52 KB, 下載次數: 14)
發表於 2014-7-19 03:36:57 | 顯示全部樓層
1. object檔,不要用機械碼來稱呼~它並不是 machine code~會造成誤會~請直接用原名翻譯"目地檔"來稱呼比較好~
2. debuging 章節~最好獨立成一章~
發表於 2014-7-19 04:24:13 | 顯示全部樓層
jojoling 發表於 2014-7-19 03:36 AM static/image/common/back.gif
1. object檔,不要用機械碼來稱呼~它並不是 machine code~會造成誤會~請直接用原名翻譯"目地檔"來稱呼比較 ...

object檔 = 目地檔?
object檔 = 目的檔,目標檔.
發表於 2014-7-21 10:42:56 | 顯示全部樓層
scottwang 發表於 2014-7-19 04:24 AM static/image/common/back.gif
object檔 = 目地檔?
object檔 = 目的檔,目標檔.

哈哈~
object file = 目標檔是一定不會錯的~
有些可能是記錯 or 習慣性用語造成的~ Sorry~
發表於 2014-7-21 12:20:09 | 顯示全部樓層
fatzeros 發表於 2014-7-19 12:50 AM static/image/common/back.gif
四、除錯模式
接下來,大胖要簡單的介紹一下除錯模式,
除錯模式可以幫助我們在長長的程式碼中快速的驗證及 ...

F0S大:
    太棒了!! 真是專業的教學啊!! 這是我在國內網站上看到最清楚的教學說明與示範,這教材真的邊的很用心,很辛苦!難怪要休息一陣子才能再出書!! 期待喔!! 雖然你起步晚一點,但是底子紮的緊實,很快就會變成高手了!! 聽說 C++很多人識為畏途,你的示範好像在寫基本的遊戲程式,真是厲害!!
    Orz.........................
發表於 2014-7-21 13:33:09 | 顯示全部樓層
我也很想學,怕腦子轉不過來,一直想玩Arduino,怕沒人教本想小強大也有玩要請他教我,看來以後要仰仗您了n_044|
發表於 2014-7-21 18:19:42 | 顯示全部樓層
Dave 發表於 2014-7-21 01:33 PM static/image/common/back.gif
我也很想學,怕腦子轉不過來,一直想玩Arduino,怕沒人教本想小強大也有玩要請他教我,看來以後要仰仗您了: ...

你可以先玩Arduino,它有點像半傻瓜式的,使用方便,免費的資源又很多,想再深入玩的話,再來玩8051或其它的.
Arduino資源.

評分

1

查看全部評分

 樓主| 發表於 2014-7-24 16:51:10 | 顯示全部樓層
我會思考一下,微控的介紹順序的!
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-12-22 03:02 PM , Processed in 0.077032 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.