2012-09-20 45 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()