開發紀錄(C)
 
開發環境:Ubuntu 15.04
  • 環境設置:
sudo apt-get install gcc-multilib libc6-dev-i386
make
./rubi ./progs/dfs.rb 
執行結果:
2 6 7 2 4 5 3 3 6 1  sum = 18
true
6 7 2 0 5 5 0 3 4 8  sum = 10
true
0 5 7 7 0 0 3 8 8 8  sum = 5
true
7 4 0 5 5 6 9 5 5 4  sum = 16
true
4 8 7 1 4 4 2 4 7 2  sum = 1
true
1 2 2 0 7 9 2 4 8 6  sum = 3
true
9 5 7 1 6 6 6 4 3 1  sum = 29
true
8 3 6 0 8 1 6 0 8 5  sum = 7
true
4 9 2 7 3 8 5 2 5 4  sum = 11
true
4 6 9 3 6 9 2 5 7 9  sum = 13
true
輔助工具:ctags + cscope + tglist 
  • stdio.h - C File:
fopen() : 以指定模式開啟檔案
fopen(argv[1], "rb"); // 以 二進位讀取檔案
fseek() : 設定在檔案中存取的位置,共需三個參數,第一個參數為指向結構 FILE 的指標,第二個參數為位移字元量,第三個參數為位移的起算位址,可以是檔案開頭 SEEK_SET 、現在位置 SEEK_CUR 或檔案結尾 SEEK_END 。
fseek(fp, 0, SEEK_END); // 檔案結尾,位移零單位
ftell() : 回傳目前檔案中存取的位置,需要一個指向結構 FILE 指標的參數。
fseek(fp, 0, SEEK_END);
ssz = ftell(fp); // 檔案 size
fread() : 將檔案的內容寫進陣列或結構中,共需四個參數,第一個參數為陣列或結構的指標,第二個參數為陣列或結構的大小,第三個參數為陣列的元素數量,如果是結構就等同 1 個陣列元素,第四個參數為指向結構 FILE 的指標。
fread(src, sizeof(char), ssz, fp);
  • stdlib.h - calloc
calloc() : 用來做動態記憶體配置,可產生動態陣列的記憶體空間,需要兩個參數,第一個參數為陣列的元素個數,第二個參數為元素所佔記憶體空間的大小。若建立成功, calloc() 回傳指向該空間的指標,否則回傳 NULL 。
calloc(sizeof(char), ssz + 2); // 個數為 sizeof(char), 大小為 ssz + 2,把程式全部的 code 當成一個字串
malloc 與 calloc 差別在於初始化記憶體,如果以效能為重,使用 malloc 可省去初始化時間,calloc 可以直接用來分配記憶體陣列。
realloc(): 用來做動態記憶體配置,可改變由 malloc() calloc() realloc()  所配置記憶體空間的大小,需要兩個參數,第一個參數為指向原始空間的指標,第二個參數為新空間的大小。若調整成功, realloc() 回傳指向重新分配空間的指標,否則回傳 NULL 。
將程式碼讀入後就是程式的最精華部份-execute(src):
標準 compile 流程 lexical analysis, parse 來產生目的碼對應的 machine code,以
((int (*)(int *, void **)) ntvCode)(0, funcTable);