0

同じ累乗でモノムを合計する関数を作成する必要があります。モノムは次の構造体によって定義されます。

typedef struct monom {
    int coefficient; 
    int power;
}MONOM;

そして、私が仕事から書いた機能は次のとおりです。

int sumMonomsWithSamePower(MONOM** polynomial, int size)
{
        int i, powerIndex = 0;

        for (i = 0; i < size; i++)
        {
            if ((polynomial[powerIndex])->power == (polynomial[i])->power)
                {
                        if (powerIndex != i)
                                (polynomial[powerIndex])->coefficient += (polynomial[i])->coefficient;

                }

                else
                        powerIndex++;
        }

        powerIndex++;
        *polynomial = (MONOM*)realloc(polynomial, powerIndex);
        return powerIndex;
}

次の呼び出しで呼び出されています。

*polySize = sumMonomsWithSamePower(&polynomial, logSize);

多項式配列は、並べ替えられた MONOM の配列 (べき乗で昇順に並べ替えられます) として関数に送信されます。

私の問題はsumMonomsWithSamePower()、次の方法で配列内の要素を確認できないため、関数の 7 行目でクラッシュすることです。配列の要素をWatch listデバッガーに入れると、polynomial[i] を使用してもそれらを見ることができませんが、(polynomial[0]+i) を使用すると、それらをはっきりと見ることができます。

ここで何が起こっているのですか?

4

1 に答える 1

1

私はあなたが何かsumMonomsWithSamePower()を割り当てていると仮定します(他のすべてはあなたのものと一致しません)。したがって、MONOM の配列があり、polynomial[1] のメモリ位置は+バイトです。polynomialpolynomial = malloc( size * sizeof(MONOM) );realloc()polynomial[0]sizeof(MONOM)

次の段落でpolynomialは、元の配列と混同しないように (多項式へのポインター) という名前に変更します。 . しかし、ポインターの配列ではなく、構造体の配列があります。式を(もちろんそれに応じて他のすべての式を)置き換えると、その部分が機能します。ちなみに、それはまさにあなたが言及した2つのデバッガーステートメントの違いです。sumMonomsWithSamePower()ppolyMONOM **ppoly[1]sizeof(MONOM *)ppoly[0] + sizeof(MONOM *)(*ppoly)[i].power

その上、の使用に関する私のコメントを見てくださいpowerIndex

于 2013-07-19T15:51:46.620 に答える