[英]Passing a struct to a function, using pointers or not
我試圖在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行收到錯誤。 它說它期望一個結構BigNumber *但得到一個BigNumber。 我一直試圖在結果之前改變它,添加&刪除*它看起來合理,但到目前為止,我沒有工作的東西。 任何人都可以指出它有什么問題嗎? 據我所知,我傳遞了一個指向函數setPartTo()的指針,但也許我不這樣做。 我還認為不將指向結構BigNumber的指針傳遞給函數getPart是有意義的,因為它不會改變對象,但也許這也是錯誤的?
這個:
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 &result
的地址傳遞給setPartTo()
。
你的代碼:
void setPartTo(BigNumber *bigNumber, int i, int value)
{
(*bigNumber).parts[i] = value;
}
這需要一個指向BigNumber
的指針,因為您傾向於使用pass by值,這可能會使其難以使用。 您可以編寫此類版本,而不是:
BigNumber setPartTo(BigNumber bigNumber, int i, int value)
{
bigNumber.parts[i] = value;
return bigNumber;
}
您可能會發現性能方面,最好避免按值傳遞大結構。 另一方面,您的編譯器也可能會發現它並為您優化它。 如果你擔心這方面的問題,你應該閱讀生成的代碼,然后分析/測量性能。
問題出在這里:
BigNumber *result = &newBigNumber();
newBigNumber()
按值生成struct,你不能像這樣獲取它的地址。 您需要將結構分配給變量,然后在需要時稍后獲取其地址。
BigNumber result = newBigNumber();
然后在調用setPartTo()
時傳遞&result
而不是result
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.