最先遇到的問(wèn)題是編譯的問(wèn)題,我覺(jué)得環(huán)境對(duì)于一個(gè)新手有致命的阻礙作用。可能有人會(huì)說(shuō),去 google 一下不就完了,可是,實(shí)際上新手可能根本就不知道要 google 什么,我學(xué) c 很多次放棄基本上都是環(huán)境原因。
這次弄 c 主要是為了和 lua 腳本語(yǔ)言集成,其實(shí)用 java 也有得選,luajava 不失為一個(gè)好的選擇。但是長(zhǎng)久以來(lái)的小體積什么都不依賴(lài)就能運(yùn)行的 c 程序(.exe)文件對(duì)我很有吸引力,因?yàn)榘l(fā)布 java 程序就意味著要伴隨十幾M的jre(哪位知道不用jre的,請(qǐng)務(wù)必教教在下),所以,這次決定了,學(xué)習(xí) c!
IDE 嘛,就選擇了 CDT,實(shí)在是太習(xí)慣eclipse了,然后就是用 Programing in lua 中copy個(gè)例子下來(lái),編譯。我靠,錯(cuò)誤,想了想,把 lua 的那些頭文件加進(jìn)來(lái),把 lib 目錄也加進(jìn)來(lái),我靠,還是編譯不過(guò),崩潰了,放棄。
sigh,c編譯是我永遠(yuǎn)的痛!
一天在公司里,突然想起有個(gè)同事是弄 c 的,問(wèn)問(wèn)他吧。他人好熱情,給我講了好多。終于明白了,不僅要把 lib 目錄加進(jìn)來(lái),還要指定具體的 lib 文件名字,編譯通過(guò),迎來(lái)了全新的世界。
經(jīng)過(guò)一段時(shí)間的亂弄,終于如愿的把程序編譯成動(dòng)態(tài)鏈接庫(kù)(windows下的dll),引入到 lua 里,插曲:lua 原來(lái)引入動(dòng)態(tài)鏈接庫(kù)是全局的 function 叫 loadlib ,我靠,升級(jí)到 5.1 竟然改成了 package.loadlib,害我 google 了半天。不過(guò)其實(shí) 5.1 的 changelog 里是說(shuō)了的,^_^
我的 lua 終于可以調(diào) c api 了,快樂(lè)之情無(wú)法表達(dá)啊!
來(lái),再做一個(gè)使用 c 訪問(wèn)網(wǎng)頁(yè)的功能,找了半天,決定使用 wininet 庫(kù),跑到 ms 的 msdn 上一頓猛找啊,終于,皇天還不負(fù)我這個(gè)學(xué)c有心人,終于在一個(gè) xx 角落里找到了 wininet 的 api,我,我終于可以用他連網(wǎng)了!
經(jīng)過(guò)一會(huì)兒的奮斗,終于,從 http://localhost:8080/index.html 中,把自己 tomcat 的主頁(yè)訪問(wèn)了出來(lái),快樂(lè)的瞬間!
馬上就發(fā)現(xiàn)這個(gè)程序有間歇性失憶,一會(huì)兒好用,一會(huì)兒不好用。共發(fā)生過(guò)以下幾種失憶情況:
1、把代碼 copy 到一個(gè)函數(shù)中,在 main 調(diào)用這個(gè)函數(shù),程序運(yùn)行失敗!
2、刪除了調(diào)試用的 printf 方法,程序運(yùn)行失敗!
3、夸張,這個(gè)是最夸張的!把 BOOL b = HttpSendRequest(req, NULL, 0, NULL, 0); 前面的 BOOL b = 去掉,只留下 HttpSendRequest(req, NULL, 0, NULL, 0);,失敗!!!!!!!這樣居然都失敗!加上去就好好的運(yùn)行。精神一度處于崩潰的邊緣,眼睛里的血絲一度超過(guò)狼人!
左思右想,左改右改,死都不行!
一個(gè)聲音高叫著:放棄吧,玩會(huì)游戲!
放棄了,md,再也不被 c 玩了,俺要玩俺的 java 去,下載 luajava 去,不理你了!
臨行前,我戀戀不舍地看了一眼俺的c代碼,我靠,突然發(fā)現(xiàn)這 xx 代碼居然有個(gè)問(wèn)題,這真是豁然開(kāi)朗啊。
原來(lái)是。。。(省略一萬(wàn)字)
LPDWORD n; // LPDWORD 是個(gè) unsigned long *
沒(méi)初始化!
天啊,這點(diǎn)問(wèn)題就讓我找了這么久啊,我改。
DWORD a = 0;
LPDWORD n = &a;
一切正常。
世界終于清靜了……