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

回復(fù)話題
上傳/修改頭像

四川省省會城市是哪里?(答案為兩個字)

考研論壇提示:
1、請勿發(fā)布個人聯(lián)系方式或詢問他人聯(lián)系方式,包括QQ和手機等。
2、未經(jīng)允許不得發(fā)布任何資料出售、招生中介等廣告信息。
3、如果發(fā)布了涉及以上內(nèi)容的話題或跟帖,您在考研網(wǎng)的注冊賬戶可能被禁用。

網(wǎng)站介紹 | 關(guān)于我們 | 聯(lián)系方式 | 廣告業(yè)務(wù) | 幫助信息
©1998-2015 ChinaKaoyan.com Network Studio. All Rights Reserved.

中國考研網(wǎng)-聯(lián)系地址:上海市郵政信箱088-014號 郵編:200092 Tel & Fax:021 - 5589 1949 滬ICP備12018245號