發表文章

目前顯示的是 七月, 2010的文章

有關C語言的struct進階初始化

之前在trace強者學長們寫的C code時,一直對某種struct initialization的方法很感興趣,卻不知道該如何使用。稍微研究一下終於有了小小心得,在此筆記一下。

假設有一個student的結構定義如下:

typedef struct student{
  char name[50];
  int studentNo;
  int age;
}student;


按照一般教科書上的寫法,初始化的方式是先宣告一個struct student的變數,然後再用點(dot)運算子去存取內部成員並賦值,例如:

struct student st1;
st1.name = "Peter";
st1.studentNo = 1234;
st1.age = 18;


但是進階的初始化方法卻是宣告直接再以點(dot)運算子賦值,例如:

student st1={
  .name = "Peter",
  .age = 18,
  .studentNo = 1234
};


原來點運算子就可以等同struct內的成員,多個成員則用(,)來分開,類似陣列(array)的宣告方法,不同的是,他賦值的順序是可以不用按照struct定義內的先後順序的!

說到陣列(array),他的宣告也是有幾種神奇的方法。
例如:

int a[7] = { [4]=29, 33, [2]=15 };
相當於
int a[7] = { 0, 0, 15, 0, 29, 33, 0 };
可以用[index]= value 的方法指定給特定的元素,沒有指派的值就是0這樣。

結合上面struct的用法,也可以一併使用combo連續技,例如:

student st2[5]={
  [3]={
      .name = "Titus",
      .age = 22,
      .studentNo = 1041 },
  [2]={
      .studentNo = 1042
      .age = 23,
      .name = "Stephen", },
}
[index]= 可以不必按照順序,裡頭的成員也不必按照順序,其餘沒指派的元素會自動初始化為0。


當然也可以將一連串連續的元素…

我的aGape新眼鏡

圖片
最近有不少人問起我的新眼鏡是啥牌子的在哪配的(奇怪都戴了快一個月了還有人問),我看了看上頭印的Mark叫做「aGape」,是個奇怪的韓國牌子。而我也不是在新竹配的,是在桃園的一家叫做「卡爾登眼鏡」配的,這家在PTT桃園版是被推爆、難得的好店。會去那配是我弟介紹的,他去年也才去那配了一副Lee Cooper的膠框眼鏡(事實上我們全家每個人幾乎都在那邊配過一支了),那家的老闆服務真的很親切很周到。

我當初配的目的是想找一副比較便宜又耐操膠框鏡架,可以讓我打球時候戴的。因為打籃球時,一些小小碰撞難免,我原來的眼鏡在打球時常常不小心滑落地上,鏡片都掉出來了,鼻墊也搖搖欲墜。(有人覺得打球應該帶隱形眼鏡才對,也比較安全,沒錯!但是我就是不敢戴隱形眼鏡呀!)

我去卡爾登眼鏡行時,本來是想先換個鼻墊而已,買不買眼鏡先逛逛再說。當時店裡生意很好,老闆正忙著熱情招呼先進來的客人們,我就在旁邊眼鏡架上一直試戴一直試戴,幾乎整面牆的鏡框都被我戴過一輪了,我對aGape這一區的眼鏡特別有好感,因為是膠框的又很有彈性、又蠻輕的,頗符合我的要求,只是不知道價位如何。後來客人一個個滿意的離開、老闆終於忙完了,也快到了打烊的時間,原本想說換個鼻墊隔天再來的,想不到老闆還是犧牲休息的時間,半關起門來要做我們最後一攤的生意。

老闆仔細的聽了我的需求後,就先叫我去驗光。驗光過程就不多說了,總之比我還要龜毛,後來結果出來是度數和前一副眼鏡是一樣的,沒有再加深(其實已經是深到近乎半瞎的狀態了)。我拿了一副蠻中意的框給老闆,老闆知道我這近視程度一戴那種沒度數的眼鏡,根本看不到鏡子裡的自己戴起來是如何,還硬是要我戴上日拋的隱形眼鏡才看得清楚(大推他不急不躁、細心的服務態度!)。老闆又從抽屜裡取出三四副類似的給我選,後來就選了深棕色、裡頭是乳白色的這副(如上圖)。

這副鏡框是一種很特別的「記憶膠框」材質,可以凹來折去都不會斷,又是沒有鼻墊的設計,剛好都符合我打球使用的需求(雖然老闆說這打球才戴太浪費了,平常戴也是很好看的)。不過當我看到裡頭寫著「MADE IN KOREA」時,眉頭不由得皺了一下,我也是很愛國的阿!韓貨能不買就不買的。老闆看了我的表情,彷彿也知道案情並不單純,解釋著說「我們也很討厭韓國阿!不過沒辦法,這種記憶膠框的材質是他們的專利,只有他們才做得出來!」好吧!為了生活我可以忍,就像當年剛有17…

eSENSE J985多介面SATA&IDE轉USB快捷線使用心得

圖片
今晚陪學長去買外接硬碟,去NOVA和順發晃一晃,我順便想買一條IDE轉USB的轉接線,因為剛好有幾顆剛汰換下來的舊IDE硬碟,想說接個轉接線就可以變成外接硬碟,就可以繼續利用了,然而「物盡其用、童叟無欺」又是我做人的宗旨,於是乎就開始在NOVA裡尋尋覓覓。

這種轉接線,看來看去只有伽利略eSENSE這兩家最多,他們兩家各推出三四個產品,每種盒子都長的不太一樣,我拿起來比對了很久,實在搞不懂那些細微的差異,也不需要OTB(單鍵備份)的功能,所以就買最便宜的一款,eSENSE橘色包裝的J985,順發含稅價499元整。

內容物如上圖,共有:
J985轉接線主體電源線+變壓器SATA電源延長線3.5”硬碟矽膠保護套說明書一張他的特色是:
支援Windows 7可同時連接2種裝置穩定的2.5安培供電「號稱」SATA硬碟相容性高上網登錄,兩年保固 (另一家伽利略的保固就不知道怎麼樣了......)

買回家後上網研究了一番,才發現這種「SATA/IDE轉USB的快捷線」不是隨便買買就好了,隨便買買很容易就踩到地雷了,某幾款型號會有「複製成功但檔案比對錯誤的情形」,讀取時某些錯誤的地方會差兩個byte,這可是很可怕的事情!(這也讓網友給揪了出來,網友真的是太強大了!)在PCDVD這個討論串有很激烈的討論,伽利略eSENSE這兩家都無一倖免、災情不斷,因為他們都是採用JMicron的晶片。那討論串搞到最後連JMicron都派人跑上來回文滅火了,賣產品系統商的不理不睬,chip商卻跑上來回End-user的鄉民文章,實在是很搞笑!更搞笑的是問題根本不是出在chip,而是系統工廠的Lay-out多上了一個不必要的電阻所以會造成PATA硬碟讀取檔案時造成錯誤,然後就有神人自行拆機解銲R15電阻(4.72K 歐姆)然後經過實驗後回報狀況果然回復正常!買個產品想要正常使用,還要自己解銲電阻,學習焊槍和吸錫的技巧,實在是太寓教於樂了阿!XD


而我終於爬完那21頁的文章後,第一件事馬上裝起來過電,傳個大檔測試比對一下。(雖然覺得我買的是最新的型號,廠商應該已經解決了這問題了,但總還是不夠放心...)我傳輸了個DVD-9 ISO檔單檔總共8GB多,然後也是用DOS下的FC指令比對檔案,指令大約如下:

C:\>fc /b c:\data\xxx.iso d:\dvd\xxx.iso

比對後報…

LAMY Safari白色鋼筆

圖片
上週朋友冷不防送我一支筆,說是預先當做我的生日禮物,哈哈!所謂送禮送到心坎裡就是這意思吧!打開一看,是全白的鋼筆耶,還是Made in Germany耶!真是不好意思讓他破費,不過我真的很喜歡阿!裝了墨水後就在列印紙的背面塗鴉了好久......。

話說回來,我已經記不得上回用鋼筆寫字是什麼年代的事兒了,好像是國中某次段考名列前茅,老爸買了一支白金牌的鋼筆送我吧!不過便宜的鋼筆很挑紙,還有容易暈墨、出墨不順、粗細難以掌握等等缺點,有時筆尖漏出墨水,不但蘸了滿手,也弄髒了紙本。所以當時也不是特愛用鋼筆,總覺得滑不溜丟的鋼珠筆才寫得順手。


自從有了電腦之後,也不知多久沒有提筆寫作了。我回想起小時後「爬格子」的時光。小學二三年級時的作文,常被老師要求投稿到「國語日報」,於是我就得利用課後,乖乖的取出600字的綠色稿紙,一字一字的把作文簿上的句子給謄在稿紙上。

依我當時的字量,每次大概都得爬滿三張稿紙左右,寫到後頭,右手非常的酸痛,頭也抬得累了,有時索性就伏在案上以左手當枕趴著繼續寫,被老媽發現後,免不了一陣痛罵,我想我的視力在當時就開始變壞了吧!這個「謄稿」的畫面深深烙在我的童年印象中,我家的櫃子裡好像還有一本老媽收集的剪貼簿,裡頭貼著我國語日報刊登上的十來篇文章。


這支LAMY鋼筆蠻好握的,連續書寫也不太會酸,但是他的筆尖感覺硬度很夠,大概是德國人的個性都比較剛毅吧!我在PChome購物有看到LAMY的專區,觀察一下這支應該是最經典的「safari」款,真的是很耐看阿!連mobile01都說LAMY是設計師的筆,不過我曾經嘗試拿這支筆寫幾行code畫幾個架構圖在紙上,還是一點靈感也沒有,大概這個設計師不包括「程式設計師」吧?看來工欲善其事,利其器也不見得管用,還是先有顆好腦袋比較要緊。



在此拿這筆和這友人先前送我的逸品「文友樓詩草」合個影,這本詩集是他老爸寫的,裡頭收錄的詩非常的酷,難以形容的絕妙,不過這本書不知道哪裡買的到就是了,所以大家可能也無此眼福一窺其風貌。希望我用了這支筆將來也能「妙筆生花」,文思有如泉湧阿!

[Chrome]擴充套件個人Top20精選

圖片
個人身為Google的信徒,當然從Google Chrome瀏覽器一推出時就使用他至今了,而他本身的表現也確實夠優異。其中最令人稱道的就是目前無可匹敵、比閃電還快的瀏覽速度(尤其是內含javascript的網頁),對於現今一個比一肥大的網頁,他的瀏覽效能改善是顯而易見的。

以現今瀏覽器的市佔率來說,排名第一的IE他的爛是有目共睹、罄竹難書,就別提了(只有在登入網路ATM或網路銀行時需要ActiveX時才會逼不得已使用他),排名第二的FireFox仍然是客製化的極品,豐富的Add-Ons為其最大特色。再來就是Chrome了,他的市佔率已經悄悄的幹掉蘋果的Safari了,我相信Chrome的市佔率一定會慢慢急起直追直逼FireFox的。

自從Chrome也支持了「擴充套件」之後,官方和非官方的套件一一出爐,雖然數量和品質還無法撼動「附加元件」王者--FireFox的地位,但是也足夠我絕大部分的需求了(幾乎FireFox好用的套件也都有出Chrome版的了)。接下來推薦一下我個人偏愛的Chrome擴充套件精選,我大略分為三類:「非裝不可」類、「見仁見智」類和「可有可無」類。


非裝不可類:AdBlock:有效的把一些網頁上討人厭的廣告給消失,除非你超愛看垃圾廣告,否則必裝無疑!Mouse Stroke:滑鼠手勢+拖放手勢,超級超級推薦安裝的套件!沒有用他我上網簡直跟殘廢沒兩樣!Chrome有很多滑鼠手勢的套件,例如Smooth GesturesChrome Gestures,但這比較少人推薦的Mouse Stroke反而深得我心,除了可自訂各式各樣的滑鼠手勢外,我最喜歡「反白字串後再拖曳即可另開分頁並將該字串以Google搜尋」(簡單來說就是Drag-To-Go)這功能,Chrome內建只能「反白字串後按右鍵選擇『在Google上搜尋...』」已經算很貼心的設計了,不過直接拖曳放開還是更好用又更直覺。這套件的「選項」有非常多的設定,值得你好好的玩味一下,在此就不多說了。IE Tab:將目前分頁改成用IE核心來開,裝了這個就可以徹底跟IE說掰掰了,例如我開頭所說的很多銀行網頁用Chrome開啟後卻跟你說他是「IE Only」的,就可以點選這個icon把這網頁變成用IE開啟,還可以將這頁存在書籤裡,以後進這網址自動會以IE開啟。Google 文件 PDF/PowerPoin…

有關C語言的static用法

由於工作的關係使用的是C語言,而static的關鍵字我卻常以JAVA的角度來理解而造成誤解,經過trace大量的code和翻查一些書後,我總算搞懂static在C語言中的用法了。原來他是依修飾的對象不同而有不同的功能,大致上就分為兩種,簡單筆記如下,以免以後自己又忘了:


1. 使用在全域變數或全域函式 (Global variable & Global function)
讓該變數(或該函式)的可視範圍只侷限在該檔案內,其他的 .c檔看不到此變數(或函式)的存在。
既使其他檔案用extern宣告也看不到!套句行話來說,他把Global的變數或函數變成了「internal linkage」,當Linker在找symbol時是會忽略它的。
(在C++中也相容這種用法,不過被視為比較不建議的舊的用法,C++比較建議使用unnamed namespace。)

使用時機:當此全域變數(或全域函式)不想被其他檔案引用和修改時,或者不同檔案可以使用相同名字的全域變數(或全域函式)而不會產生命名衝突。

2. 使用在函式內的區域變數 (Local variable)
因為區域變數預設就是動態變數,而在區域變數前加上static修飾字則會將變數由動態(dynamic)變數轉為靜態(static)變數,靜態變數的壽命(lifetime)與動態變數不同,靜態變數會一直存在,直到程式結束為止。

使用時機:這種很適合用來做統計次數的功能(某函式被呼叫幾次),例如以下的代碼...


void count();
int main()
{
int i;
for (i = 1; i <= 10; i++)
count();
return 0;
}
void count()
{
static cnt = 0;
cnt++;
printf(" It have been called %d",cnt,"times\n");
}

其執行結果就會是:
It have been called 1 times.
It have been called 2 times.
It have been called 3 times.




做個總結,static的用法整理如下表:

修飾對象   使用在...    Linkage    Scope
------------------…