2012-09-20 59 views
1

我試圖在c中實現一個簡單的BigNumber包,它可以執行算術運算。但是,我堅持。我相當新的C,所以我不知道如果我使用指針和引用正確。將結構傳遞給函數,使用指針或不使用指針

繼承人到目前爲止我的代碼:

#define MAXPARTS 60 

struct BigNumber 
{ 
    int parts[MAXPARTS]; 
}; 

typedef struct BigNumber BigNumber; 

BigNumber newBigNumber() 
{ 
    BigNumber bi; 
    int i; 
    for(i = 0; i < MAXPARTS; i++) 
    { 
     bi.parts[i] = 0; 
    } 
    return bi; 
} 

void setPartTo(BigNumber *bigNumber, int i, int value) 
{ 
    (*bigNumber).parts[i] = value; 
} 

int getPart(BigNumber bigNumber, int i, int value) 
{ 
    return bigNumber.parts[i]; 
} 

BigNumber add(BigNumber a, BigNumber b) 
{ 
    int carrier = 0; 
    BigNumber *result = &newBigNumber(); 
    int i; 
    for(i = 0; i < MAXPARTS; i++) 
    { 
     setPartTo(result, i, getPart(a, i)+getPart(b, i)+carrier); 
    } 
    return result; 
} 

我得到一個錯誤在add函數的setPartTo線。它說它期望一個struct BigNumber *,但有一個BigNumber。我一直在試圖改變結果之前的事情,加入&和刪除*看起來合理的,但到目前爲止,我還沒有得到的東西工作。有人能指出它有什麼問題嗎?據我所見,我傳遞了一個指向函數setPartTo()的指針,但也許我沒有。我也認爲不要將指向結構BigNumber的指針傳遞給getPart函數是有意義的,因爲它不會更改對象,但也許這是錯誤的?

+0

我現在看到,也是加法函數不是數學上正確的,但我寧願先修復其他錯誤。 – user1661303

+0

加,newBigNumber()返回一個本地結構,在您使用它的時候超出了範圍。你應該malloc()一個BigNumber並返回一個指向它的指針。 – deStrangis

+0

爲了避免混淆改變'typedef struct BigNumber BigNumber;'''typedef struct BigNumber_s BigNumber;''。在這之後調整它定義的這個'struct'的名字。 – alk

回答

1

您的代碼:

void setPartTo(BigNumber *bigNumber, int i, int value) 
{ 
    (*bigNumber).parts[i] = value; 
} 

這需要一個指向一個BigNumber,這可能使它難以與因爲你傾向於值使用通工作。你可以寫這樣一個版本的這個,而是:

BigNumber setPartTo(BigNumber bigNumber, int i, int value) 
{ 
    bigNumber.parts[i] = value; 
    return bigNumber; 
} 

您可能會發現性能的角度來看,這是更好地避免按值傳遞大結構。另一方面,你的編譯器也可能會發現它併爲你優化它。如果您擔心這方面的問題,當然應該閱讀生成的代碼,並描述/測量性能。

1

的問題是在這裏:

BigNumber *result = &newBigNumber(); 

newBigNumber()結果通過價值結構,你不能把它的地址是這樣的。您需要將結構賦值給一個變量,然後在需要時再使用它的地址。

BigNumber result = newBigNumber(); 

,當你調用setPartTo()再通&result代替result

2

此:

setPartTo(result, i, getPart(a, i)+getPart(b, i)+carrier); 

是不正確的,只有兩個參數被傳遞到getPart(),它有三個參數:

int getPart(BigNumber bigNumber, int i, int value) 

編譯器將已發出的其他錯誤,除了一個貼在問題中。

此外,如已經提到Graham Borland你需要存儲的newBigNumber()返回值:

BigNumber result = newBigNumber(); 

再通的結果,&result的地址,到setPartTo()