1

算術演算を実行できる単純な BigNumber パッケージを c で実装しようとしています。しかし、私は立ち往生しています。私は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 に渡さないことも理にかなっていると思いますが、これも間違っているのでしょうか?

4

3 に答える 3

2

これ:

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

に渡される引数は 2 つだけでgetPart()、3 つの引数を取るため、は正しくありません。

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

コンパイラは、質問に投稿されたものに加えて、他のエラーを出力します。

さらに、Graham Borlandが既に述べたように、次の戻り値を格納する必要がありますnewBigNumber()

BigNumber result = newBigNumber();

&result結果のアドレスをに渡しますsetPartTo()

于 2012-09-20T10:22:39.203 に答える
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;
}

パフォーマンスの観点から、大きな構造体を値で渡すことは避けたほうがよいでしょう。一方、コンパイラもそれを見つけて最適化する場合があります。この側面について少しでも心配している場合は、もちろん、生成されたコードを読み、パフォーマンスをプロファイリング/測定する必要があります。

于 2012-09-20T10:16:37.473 に答える
1

問題はここにあります:

BigNumber *result = &newBigNumber();

newBigNumber()値によって構造体が返され、このようにそのアドレスを取得することはできません。構造体を変数に割り当て、後で必要に応じてそのアドレスを取得する必要があります。

BigNumber result = newBigNumber();

次に、 を呼び出すとき&resultの代わりに渡します。resultsetPartTo()

于 2012-09-20T10:19:17.530 に答える