2009年6月28日 星期日

取得浮點數(float)的最大值

其他資料型態應該也可以這樣做...
因為不同平台的資料型態的位元數可能不太一樣,用這個方法比較保險

  1. include float.h
  2. use FLT_MAX

2009年6月27日 星期六

計算程式碼行數

wc -l *.c *.h | grep total

wc: 計算行數、字數及字元數
  • -l 計算行數(line)
  • -w 計算字數(word)
  • -c 計算字元數(character)

2009年6月25日 星期四

C陣列長度取得(用malloc的方法)

當使用動態記憶體配置時

無法使用sizeof的技巧來取得陣列長度

不過可以寫一個自己的malloc和free來計算並維護各個動態分配的長度!!


  1. 寫mymalloc在malloc時記錄下這塊記憶體的陣列元素個數
  2. 寫myfree在free時把記錄下來的對應刪掉

#include
#include
#include

typedef struct arr_sz_t{

void * pointer;
int length;

struct arr_sz_t *next;

}arr_sz;

static arr_sz *sz_mapping;

void* mymalloc(int length, int size);
void myfree(void *p);
void add_sz_entry(void* p, int length);
int arr_length(void* p);

//input 1.array length 2.unit size
void* mymalloc(int length, int size){


void* ret = malloc(length*size);

add_sz_entry(ret, length);

return ret;
}

//free with mapping table
void myfree(void *p){

free(p);

if(sz_mapping != NULL){
arr_sz * t;
t = sz_mapping;

if(t->pointer == p){
sz_mapping = t->next;
free(t);
return;
}

while(t->next != NULL){
arr_sz *next;
next = t->next;
if(next->pointer == p){
t->next = next->next;
free(next);
return;
}

t = t->next;
}
}

}

void add_sz_entry(void* p, int length){
arr_sz* t = (arr_sz *)malloc(sizeof(arr_sz));

t->next = NULL;
t->pointer = p;
t->length = length;

//no sz_mapping
if(sz_mapping == NULL){
sz_mapping = t;
}
//insert
else{
t->next = sz_mapping;
sz_mapping = t;
}
}



//if no mach in mapping table, size is 0
int arr_length(void* p){
//no mapping data
if(sz_mapping == NULL){
return 0;
}

arr_sz* t;
t = sz_mapping;

while(t != NULL){
if(t->pointer == p){
return t->length;
}
t = t->next;
}

return 0;
}


int main(void){
srand(time(0));

int *data[50];

int i;

for(i=0;i<50;i++){
data[i] = (int *)mymalloc(random()%50, sizeof(int));
printf("size of data[%d]: %d\n", i, arr_length(data[i]));
myfree(data[i]);
}

return 0;

}

2009年5月19日 星期二

C的typedef

typedef的功用就是把某些東西變成一個預設的型態(像是int、double、char等型態)來使用
這些東西可以是enum、struct...


  • 原本:
struct people{
char name[20];
int height;
int weight;
};

struct people a;

  • 可以寫成
typedef struct people{
char name[20];
int height;
int weight;
}People;

People a;


  • 原本
enum week{ Sun, Mon, Tue, Wed, Thu, Fri, Sat};
enum week today = Sun;
  • 可以寫成
typedef enum week{ Sun, Mon, Tue, Wed, Thu, Fri, Sat}Week;
Week today = Sun

C的enum

實際上enum應該裡面是int,
可以用printf的%d來顯示,
預設的對應就是從數字0開始,
例如enum week{ Sun, Mon, Tue, Wed, Thu, Fri, Sat};
Sun = 0, Mon = 1, Tue = 2, Wed = 3..........................

當然這個對應可以手動指定,像是這樣:
enum week{ Sun=1, Mon, Tue, Wed, Thu, Fri, Sat};
手動指定之後後面若沒有手動指定則會依照手動指定的那一個一直遞增。
Sun = 1, Mon = 2, Tue = 3, Wed = 4.............

要注意有時候手動指定可能會有問題,像是這樣:
enum week{ Sun, Mon, Tue=1, Wed, Thu, Fri, Sat};
Sun = 0, Mon = 1, Tue = 1, Wed = 2.............


====================================================================
  • 一般用法,宣告一個叫做week的列舉,宣告一個week型態的today且指明是哪一天
enum week{ Sun, Mon, Tue, Wed, Thu, Fri, Sat};
enum week today = Sun;

  • 在宣告week時可以順便宣告這種型態的變數today
enum week{ Sun, Mon, Tue, Wed, Thu, Fri, Sat}today;
today = Sun;

  • 可以使用typedef把enum week定義成Week型態,之後就直接使用Week型態來宣告變數即可,不必每次都再加入enum(簡單來說就是之後都用Week取代enum week)
typedef enum week{ Sun, Mon, Tue, Wed, Thu, Fri, Sat}Week;
Week today = Sun

2009年5月5日 星期二

ubuntu內的sh是指到dash

bin/
lrwxrwxrwx 1 root root 4 Dec 6 16:29 sh -> dash

dash使用for(( i=0;i<10;i++> ))這種用法會出現
Syntax error: Bad for loop variable




解決方法是:
  1. 使用bash來跑script
    bash a.sh
  2. 修改~/.bashrc加入
    alias sh='bash'



ps. 使用dash的原因
sudo dpkg-reconfigure dash

The default /bin/sh shell on Debian and Debian-based systems is bash.
However, since the default shell is required to be POSIX-compliant, any shell that conforms to POSIX, such as dash, can serve as /bin/sh.
You may wish to do this because dash is faster and smaller than bash.


2009年4月29日 星期三

FTL介紹

FTL(flash translation layer)是一個轉換的介面,
使得flash 能夠被當作一般的儲存裝置使用(因為他不能直接更新檔案內容)

主要的作用有:
  • 位址轉換,把LBA(logical block address)轉換成flash上的位址
  • garbage collection(GC),由於flash的out-of-place update的關係,會造成有一些page被invalid掉,所以需要回收這些page
(FTL的效能受GC影響最明顯)






上面的page 和block大小只是個範例,實際上有的會不一樣(例如page為4K之類)



FTL位址轉換對應基本上最簡單的可以分成兩種:
  • page level - 對應比較細,但占用較大的轉換表(非常之大......)
  • block level - 對應比較粗躁,在GC的overhead很大(因為只要修改一個page就要重寫整個block),但是節省轉換表
基本上page level是沒辦法用的,block level有缺點,所以有一些替代方案,
像是已知的NFTL或是Log buffer-based FTL schemes之類