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 是有意义的,因为它不会更改对象,但也许这也是错误的?

4

3 回答 3

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();

然后将结果的地址 , 传递&resultsetPartTo().

于 2012-09-20T10:22:39.203 回答
1

你的代码:

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

这需要一个指向 a 的指针BigNumber,这可能会使其难以使用,因为您倾向于使用按值传递。你可以写一个这样的版本,而不是:

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

您可能会发现在性能方面,最好避免按值传递大型结构。另一方面,您的编译器也可能会发现并为您优化它。如果您完全担心这方面,您当然应该阅读生成的代码,并分析/测量性能。

于 2012-09-20T10:16:37.473 回答
1

问题在这里:

BigNumber *result = &newBigNumber();

newBigNumber()按值生成结构,你不能这样取它的地址。您需要将结构分配给一个变量,然后在需要时获取它的地址。

BigNumber result = newBigNumber();

然后通过&result而不是result在您调用时传递setPartTo()

于 2012-09-20T10:19:17.530 回答