2015年8月20日

[讀書會] Intro to C and C++。4。Data Structure

噗浪連結按這裡,上課用的講義和作業按我

Memory issues:更多說明在這邊

  • Illegal memory access (segmentation fault):本來只要讀寫n byte但多讀寫了一點,或是要讀null pointer
  • Stack overflow:recursive function沒有停下來
  • Double frees
  • Uninitialized variables:變數沒有初始化
  • Memory leaks: 佔了記憶體,但因為種種原因沒有釋放。會讓程式越跑越慢,嚴重時還會記憶體不足當機。造成的原因有:
    • Reassignment:pointer被assign成別的值,被指向的記憶體就變孤兒了
    • Freeing the parent block first:指標被先free掉了
    • Improper handling of return values:function的return value是pointer,但呼叫函數的人沒把return value好好assign到變數


Structures and Unions:只有data的object的感覺
struct宣告:
struct struct_name{
    //data set
    int a;
    char b
};
struct 變數宣告:
struct struct_name variable_name = {var, var...} 只能在宣告的時候用?
或用 struct_name.struct_member給值(平常也可以用)
Struct用pointer宣告:
struct struct_name* var_pointer_name = malloc(sizeof(struct struct_name));
var_pointer_name -> struct_member = 1;
struct memory:裡面的member要align。基本上幾byte的東西,開始位址一定就是幾byte的倍數。比如說short一定要開始在偶數位址,int的開始位址一定是4的倍數。中間有空的會用padding。可以用sizeof實驗看看。
memory alignment

Union:跟Struct很像但是只能用其中一個member。想不到存在的理由。
opaque types:
看不懂
Typedef
typefed exsiting_type alternate_name;
Enum
enum enum_name {member, member....};

作業
windows沒辦法裝Valgrind,另外google到一些類似軟體我也還沒搞清楚要怎麼用。借了我家阿宅的Mac結果OS版本太新Valgrind也不支援囧。
作業一的錯誤在於uninitialized variable x、x[10] out of bound 還有沒有free x?



2015年8月8日

[讀書會] Intro to C and C++。3。C Memory Management


噗浪連結還沒設,上課用的講義和作業按我

Computer memory

Heap:a chunk of memory that users can use to dynamically allocated memory. Lasts until freed, or program exits.
Stack:contains local variables from functions and related book-keeping data. LIFO. 從比較大的address開始?
Function variables are pushed onto stack when called. popped off stack when return.

Pointers/Addresses

每一個變數都是一個「位址」和「值」的組合。pointer是指向某個變數的變數 ,基本上就是那個變數的位址啦。
宣告的時候可以直接宣告變數的type(例如 int x、char x)
或是宣告變數的指標,只要在變數的類型前面加*就是了(例如 int* x、 char* x)。

變數前面加&就可以得到位址(例如變數x的位址 ptr = &x)
位址前面加*就可以得到那個位址上的值(x = *ptr)。用*ptr取得變數值的做法叫做dereferencing。

pointer本身也是變數,所以可以有pointer to pointer:char** ptr。

data type size:
  • char: 1 byte
  • bool: 1 byte
  • int: 4 byte
  • float: 4 byte
  • double: 8 byte
可以用sizeof(data type)取得!

Arrays
通常就是一堆memory。宣告方法是 data_type array_name[array_size] (例如 int x[5])。size定下來之後就不能改。可以用 {element1, element2, ...}初始化。用array_name[nth]取得第n個的值。
array_name就是指向array最開始的pointer。也等於&array_name[0]。
C沒有字串String這個type,字串要用char的array做。實際上char array的長度是總共字元加一,因為最後會有一個\0(是零,不是歐)用來null的東西。String可以用"xxx"來宣告,compiler懂。char則是用單括號'x'宣告。

Memory Allocation
#include
malloc(size)
realloc(pointer_name, size)
free(pointer_name)

2015年8月1日

[讀書會] Intro to C and C++。2。Core C

突然發現標題好像太長。

噗浪連結還沒設,上課用的講義和作業按我

Control Structures:用來控制要跑哪一段程式碼。重複跑、有條件的跑等等都辦的到喔。
  • while
  • do...while:保證起碼會會跑一次,不然跟while完全一樣。
  • for
  • if [else if], [...else]
  • switch
  • jumps:
    • continue
    • breaks:
    • return
    • goto:會讓 code 看起來很亂!
Variables and Functions
變數的種類有
  • 一般
  • const:不能改
  • static:數值會保留,不會因為出了function就消失
Scope
變數的Scope就是變數有定義的區塊。通常在指的是一開始被宣告的{ }之中。
Anonymous blocks 就是用{ } 刮起來,讓變數只在括號內有定義的區塊。

避免以下幾種情況:
  • Uninitialized variables. 沒有給初始值的變數
  • Out-of-bonds array access
  • Variables passed out of their defining function's scope
  • malloc
作業小心得:
在C裡,main() 是程式開始的地方。他只能有main(int argc, char ** argv)兩種參數。argc 是 argument count的縮寫,argv 是一個pointer,指向參數的地址。在作業一裡,如果要寫一個 function 把參數傳進去,只要給 function 同樣的參數 function(int argc, char ** argv) 就可以了。

2015年7月31日

[讀書會] Intro to C and C++。1。Compilation Pipeline

相當沒重點的噗浪連結請按我,上課用的講義按我

上課講義整理+心得:

為什麼要學C?
  • 要求Performance
    • zero-overhead principle,清爽零負擔
  • 要直接和硬體接軌
    • 硬體 → 組合語言 → C → C++ → C++11,後面的是用來整理前面的
Compilation pipeline
從Source code變成可以執行的程式之間,到底發生了什麼事?
  • pre-process:剪剪貼貼。包括以下幾種動作:
    • #include
      • 把其他檔案貼過來。
      • 不是import?
    • #define
      • 把某些字代換成其他字。也叫做 macro。可以減少打字時間。
    • #ifdef 或 ifndef
      • 如果有定義某個變數,就執行從 #ifdef (變數)...到 #endif 之間的code。可以定義一些debug用的訊息,正式release的時候不要設變數就不會印出來。
  • Compile:把 source code 轉換成CPU指令 assembly language。這時候得注意:
    • Type checking
      • C很邪惡,type不對只會給warning。基本上任何兩個type都可以互相cast,不過你不會想要這樣的吧寶貝
    • Linear Processing
      • 只有C這麼煩,要用的function一定要先寫或先定義。
  • Link:把不同的檔案合在一起?

其他雜七雜八
< > angle brackets:compiler會去系統資料夾裡找檔案
"" double quotes:在目前的資料夾裡找檔

作業小心得

  • 安裝cygwin的說明在這邊,安裝時請選擇gcc-core, gcc-g++, gdc等package。這些是C 的compiler。
  • 作業 2 題目 2 給的檔案有以下 code,在 #ifdef 之後 #define 用在如果已經有 include 過相同的function那就不要用這個,如果沒有就用這個。

#ifndef _FIBONACCI_H
#define _FIBONACCI_H
.....
#endif









[讀書會] Intro to C and C++。總整理

使用的是 MIT Open course 的 Introduction to C and C++,連結在這裡

總共有以下八個章節:

  1. Compilation Pipeline (連結,更新中)
  2. Control Structures, Variables, Scope, and Uninitialized Memory
  3. C Memory Management
  4. Data Structures, Debugging
  5. C++ Introduction, Classes, and Templates
  6. C++ Inheritance
  7. Parent Destructors, C++ Casts, References, Namespaces, Operator Overloading, Streams 
  8. Standard Template Library, Exceptions, Function Pointers, C++11