幫朋友分析程序--新手看看
查看(1152) 回復(fù)(0) |
|
lyh2006
|
發(fā)表于 2010-08-18 19:34
樓主
考研之路已結(jié)束,閑得無(wú)聊,正好一個(gè)今年跨考的朋友叫我?guī)退纯磳懙拇a為什么運(yùn)行不了,就分析了一下,
發(fā)現(xiàn)了一些常見的問題,這正是不會(huì)寫代碼的新人常見的問題,于是就發(fā)上來(lái)了.新手可以看看,高手就不用看笑話了. 如果發(fā)現(xiàn)自己動(dòng)力能力很差的同學(xué),也可以看看,從中找找啟發(fā). 部分代碼: 復(fù)制內(nèi)容到剪貼板 代碼: #define maxsize 50 typedef int type; typedef struct { type elem[maxsize]; int length; }sqlist; void initlist(sqlist *l) { l=(sqlist *)malloc(sizeof(sqlist)); l->length=0; } int listinsert(sqlist *&l,int i,type e) { int j; if(i<1||i>l->length+1) return 0; i--; for(j=l->length;j>i;j--) l->elem[j]=l->elem[j-1]; l->elem=e; l->length++; return 1; } ...... main() { sqlist *l; type x; initlist(l); listinsert(l,1,1); listinsert(l,2,2); ...... 1.這個(gè)sqlist跟本沒有價(jià)值. 明顯作者意圖是寫一個(gè)鏈表.但鏈表的特點(diǎn)是什么?是方便插入刪除運(yùn)算,大小易擴(kuò)充. 而這里用的靜態(tài)數(shù)組實(shí)現(xiàn),還define了maxsize,而insert中也沒有重分配空間的意圖.鏈表的特點(diǎn)在這里完全沒有體現(xiàn)出來(lái). 插入刪除需要大量元素移動(dòng),malloc一個(gè)固定大小出來(lái),大了是浪費(fèi),小了就沒用了. 這些是學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)是要理解的基礎(chǔ)東西.每一種數(shù)據(jù)結(jié)構(gòu)存在的優(yōu)缺點(diǎn)一定要弄清楚. 2.代碼風(fēng)格 看這種風(fēng)格就知道又是嚴(yán)奶奶"類C"的受害者.特別是把C++的引用搞到C上面,害了多少初學(xué)者. 對(duì)于C,可以看到很多代碼都是直接把結(jié)點(diǎn)指針就定義成鏈表類型了. #define list node* 而對(duì)于C++,則采用類,類中封裝頭結(jié)點(diǎn)(指針),可能還會(huì)封裝length,在構(gòu)造函數(shù)中初始化. class list { node* head; int length; }; 這些東西混用之后就有點(diǎn)四不像的感覺了.特別是現(xiàn)在看sqlist *&l 這樣的東西覺得特別扭(雖然一年前我也寫這種句子). 按C的習(xí)慣,可以選擇用指針實(shí)現(xiàn)引用的功能.C代碼中是沒有引用的.但可以用sqlist **l 呀. 其實(shí)這里 initlist按C風(fēng)格來(lái)做,可以用個(gè)宏來(lái)寫,還更美觀些而且不會(huì)出現(xiàn)弄不清引用,參數(shù)傳遞等容易犯的錯(cuò)誤. 復(fù)制內(nèi)容到剪貼板 代碼: #define INITLIST(l) do{ l=(sqlist *)malloc(sizeof(sqlist)); l->length=0;}while(0) 如果看過(guò)linux內(nèi)核的代碼,就會(huì)發(fā)現(xiàn)很多地方都用這類的宏.反正感覺是比類C看起來(lái)地道. 3.函數(shù)參數(shù)傳遞 這是新手最容易出的問題.我拿到代碼就編譯,運(yùn)行后內(nèi)存錯(cuò)誤.然后就發(fā)現(xiàn)initlist沒能正確地完全任務(wù) 再看發(fā)現(xiàn) void initlist(sqlist *l) 這里,l傳值進(jìn)去后的修改是不會(huì)返回到實(shí)參的,新手在這些地方很容易出錯(cuò). C語(yǔ)言的基礎(chǔ)一定要學(xué)扎實(shí).這里可以改一改,比如以引用方式傳void initlist(sqlist * &l).或者我上面也寫了,用宏實(shí)現(xiàn)就沒有傳參的問題. 而后面那個(gè)listinsert不必用傳引用的方式,因?yàn)樵诤瘮?shù)內(nèi)部修改的不是sqlist指針而是其指向的空間.這里可以看出來(lái)我這位朋友對(duì)函數(shù)參數(shù)傳遞還是沒理解透. 希望對(duì)這個(gè)還不熟的朋友們都回顧一下. 4.文件包含問題 朋友把代碼發(fā)給我的時(shí)候亂七八糟的,上面已經(jīng)是整理過(guò)后的片斷了.原始的上面還好多extern...函數(shù)定義和聲明都放的.cpp,還把cpp文件都include進(jìn)去... 文件包含其實(shí)說(shuō)簡(jiǎn)單很簡(jiǎn)單,說(shuō)深很深.反正記住是聲明放在頭文件,實(shí)現(xiàn)放在cpp文件中. 以上是不會(huì)寫代碼的人要克服的基本問題.只是一個(gè)簡(jiǎn)單的分析. 當(dāng)然我朋友跨考的,確實(shí)這些地方還很不足.其實(shí)去年我也是這種樣子,嘿嘿. 各位研友可以看看自己存在哪些類似的問題并引起注意.動(dòng)手能力也是慢慢練上來(lái)的.多動(dòng)手就容易了. 最后祝11的研友好運(yùn)~ |
回復(fù)話題 |
||
上傳/修改頭像 |
|
|