0

Dev C++ を使用して、小さい 2D 配列オブジェクトを大きい 2D 配列オブジェクトに挿入しようとしています。それを達成しようとしているときに、解決方法がわからないコンパイラエラーが発生しました。

配列の名前を返すようにして、より小さいオブジェクトを挿入しようとします。次に、大きな配列内の値を小さな配列の値で変更しようとします。

私が問題を抱えている2行のコードがあります:

int result = smallerArray.extractPiece();
largerArray.extractArray(result);

そして、これらの 2 行のコード内で:

int Piece::extractPiece()
{
    return **pieceArray;
}

void Grid::extractArray( int** arr )
{
    for(int i = 0; i < xGrid ; ++i)
    {
         for (int j = 0; j < yGrid ; ++j)
         {
             squares[i][j] = arr[i][j];
                 }
    }
}

問題の 2 つは、「int 結果」が smallArray.extractPiece() を保持しないことと、「smallerArray.extractPiece()」を largeArray.extractArray() に入れるだけでも問題が発生することです。「int ** 結果」として、「int 結果」をポインター ポインターにしようとしましたが、まだ同じエラーが発生します。

これらは、Dev C++ でコンパイルしようとすると発生するエラーです。

In function `int main()';
invalid conversion from `int' to `int**'
initlizing argument 1 of 'void Grid::extractArray(int**)'
[Build Error] [grid test.o] Error 1

誰が何が悪いのか知っていますか?

4

2 に答える 2

1

それはまさにこの一連のコードです:

int result = smallerArray.extractPiece();
largerArray.extractArray(result);
// ...
int Piece::extractPiece() {
    return **pieceArray;
}

ポインターへのポインターを必要とするextractArrayにintを渡そうとしていますが、intではなく、動的配列を想定しています。に変更してみてください

int **result = smallerArray.extractPiece();
largerArray.extractArray(result);
// ...
int ** Piece::extractPiece() {
    return pieceArray;
}

結果をポインターへのポインターに変更するだけでは機能しません。もちろん、extractPiece が返すものも変更する必要があります (int から int** に変更)。

于 2008-12-27T07:09:45.080 に答える
1

見てください、少なくとも私にとっては常に、2D 配列を内部で M[i,j]=A[i*N+j] の 1D 配列として管理する方が簡単でした。ここで、N は列数 (2D 配列の場合は行数) です。行-列タイプ)。ユーザーは i,j インデックスを持つ要素を取得できますが、私のクラスは常に A[M * N] をプライベート データとして格納します。1 次元のポインター配列を渡すのは、2 次元のポインター配列を管理するよりも簡単です (一部のコードで混乱する可能性のあるポインターからポインターへの構文に陥ることはありません)。

これはこの質問とは関係ありませんが、特定のコンパイラ最適化組み込み関数については知らないので、生成されたコードでより単純なアドレッシング モードを使用するために、M[i,j] が内部で A[i] に変換されるのではないかと思います。

于 2008-12-27T09:08:37.073 に答える