2016年12月28日 星期三

CS50 Week 4

Lecture

講述Swap的兩個方法如下:




如同程式碼註解說明,此功能沒有成功,是因為沒有把變數的地址傳進

function裡,下一部分就會講到用指標(Pointer)來解決這個問題。

Lecture, continued

用一些Hollywood跟監、追蹤相關影片說明人們會利用監視器去追蹤某一些

人,拍到目標時,會需要放大(Zoom in)或是提高(enhance)影片中的人物,

藉此來說明如何用程式來表現顏色,簡單的就是黑與白(0跟1),彩色的話

就是255,提供一個網站來表示比較清楚:色碼轉換器

之後,就又談論到如何使用指標來解決Swap的問題。那課程中也有用生動

的方式來解釋甚麼是指標,請參考以下影片(從50:36開始)



Walkthroughs

Sigma-0




Sigma-1



NoSwap



Swap



Compare-0



Struct-0



Struct-1



Compare-1



Pointers



Copy-0



Copy-1



Section

Hexadecimal

講述人們常用的十進制,電腦用的二進制,以及為了方便簡潔看一大串二

進制的十六進制,例如: 1001010100100111,四個為一組的話就變為: 

1001 0101 0010 0111,改為十六進制: 0x9527。

Pointer

花了將近30分鐘視頻來講述指標的概念,因為之前就講過,這邊就跳過

了。

Dynamic Memory Allocation

就硬體來說,程式所做的任何操作都是在RAM裡面,而不是硬碟儲存空間裡,因此,程式都

是在有限的RAM裡操作。

動態記憶分配需要搭配指標,並且在執行結束之後,釋放記憶體。舉例來說:如果某個瀏覽

器的網頁一直開分頁,沒有釋放記憶體的話,執行速度會越來越慢,因為記憶體都被佔用完

了。在程式裡int* a = malloc(sizeof(int));實際上是建立了兩個記憶體位置,只是其中一個記憶

體位置叫做a,指向了一個沒有名字的記憶體位置。

Structures

自定義型態架構,可以把不同的型態int, char, float, array[]組合為一個型態架構。如果要用指標

的話為:struct car *mycar = malloc(sizeof(struct car));,car裡面的參數設定數值為:

(*mycar).year = 2001; (*mycar).plate = "CS50";或者這樣表示 mycar->year = 2001; mycar->plate =

"CS50";。

Defining Custom Types

自定義型態新名稱,舉例:typedef unsigned char byte;,紅色為舊名稱,藍色為新名稱。因

此,在CS50的標頭檔裡的string就是 typedef char* string; 或是 typedef struct car car_t; 或是如下



Recursion



Call Stack


6fact(1)7
5fact(2)8
4fact(3)9
3fact(4)10
2fact(5)11
開始 1main()結束 12
執行順序Stack Frames執行順序




Shorts

File I/O

三個重點:
  1. 打開檔案 fopen
  2. 寫入或讀取檔案 fputs/fgets
  3. 關閉檔案 fclose
GDB

The GNU Project Debugger,是C的強大除錯器!

在CS50 IDE的terminal輸入gdb就可進入除錯模式;
用factorial.c舉例說明:




這段程式的功能應該是要輸入一個正整數之後,會從1開始累乘到輸入的數字,例如輸入4,

就應該是4*3*2*1 = 24,但這邊的程式就有錯誤如下圖片:

這時候我們就可用GDB來找出問題,這邊要注意的是,GDB只可執行execute file,所以它沒辦

法執行.c or .h,因此在terminal輸入gdb ./factorial,也由於factorial不用輸入其他arguments,因

此可直接在terminal繼續輸入run or r來執行偵錯factorial,當然!若要觀察某行程式碼就需要下

breakpoint。breakpoint可以讓程式執行到那行程式碼暫停,好讓我們可以逐步檢查程式碼。

因為我們不知道錯誤到底是在哪段程式碼,因此我們在一開始的地方main就下breakpoint,所

以在terminal中輸入break main,可以在下圖看到breakpoint在line 10:

再輸入r讓程式執行偵錯到第10行暫停,輸入next or n就可讓程式繼續執行下一行,若要指定

在14行程式碼breakpoint的話就輸入b factorial.c:14。想在gdb模式看程式碼就輸入list or l,若要

看目前變數是為多少就輸入print or p 變數名稱。當gdb模式下直接按下enter鍵為執行上一次的

命令。執行程式到下一個breakpoint輸入continue or c。

整理gdb commands如下:

功能指令
離開除錯模式quit/q
執行run/r
中斷點break/b
逐步執行next/n
顯示程式碼list/l
顯示變數數值print/p
執行上一次命令key in enter
到下一個中斷點continue/c
觀看本地端的全部變數info locals

Merge sort, Pointers, Recursion, Strings, Structs

這邊也是重複講述,只不過是用更生動有趣的方式講解。

Problem Set 4

直接跳過XD

沒有留言:

張貼留言