0

動的なintの2D配列が必要です。これは、標準の行列を表します。サイズと要素は、実行時にファイルから読み込まれます。

他のスタックポストから指示を受けて、次のようにアレイをセットアップしました。

void buildArray(ifstream &file, int** 2dArray);
void buildQueue(Queue<int> &Q, int** 2dArray);

int main()
{
    int** 2dArray;
    Queue<int> Q;
    //...
    // open file
    //...
    buildMatrix(file, 2dArray)
    buildQueue(Q, 2dArray)
}

void buildArray(ifstream &file, int** 2dArray)
{
    int size, element;
    while (file.good()) {
        file >> size;

        2dArray = new int*[size];
        for (int i = 0; i < size; i++)
            2dArray[i] = new int[size];

        // now I should be able to use 2dArray[r][c]

        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                file >> element;
                2dArray[i][j] = element;
            }
        } 
}

次に、各位置[r] [c]に格納されているintを読み取り、キューを作成する必要があります。私の問題はポインタの逆参照だと思います...しかし、よくわかりません。

void buildQueue(Queue<int> &Q, int** 2dArray)
{
    int row, column, element;
    // size is passed in as well, size is our rows or columns size here
    for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                row = i;
                column = j;
                element = 2dArray[i][j];   // getting seg fault here!

                Q.push_back(row, column, element);
            }
     }
 }

ベクトルを使用できることがわかっていることを付け加えておきます。私はここで、ポインターを使用して2D配列を責任を持って構築、使用、および割り当て解除することに挑戦しています。

4

3 に答える 3

1

テーブルとは何ですか?

table = new int*[size];

これはすべきではありません

2dArray = new int*[size];

また、関数からポインタを返します

変化する

void buildArray(ifstream &file, int** 2dArray)

int ** buildArray(ifstream &file)

それ以外の場合、buildArrayは変数のコピーを取得するためです。そして、このコピーは、割り当てられたメモリへのポインタを保持します。呼び出し元の関数のポインターが更新されることはありません。

元のコードで、buildArray呼び出しの前後にprintf2dArrayを追加します。

printf("%p, 2dArray);
buildMatrix(file, 2dArray);
printf("%p, 2dArray);

2dArrayが変更されていないことがわかります。したがって、基本的に、初期化されていないポインタをbuildQueueに渡します。

buildArrayとcallは次のように変更する必要があります

void buildArray(ifstream &file, int** arr)
{
    int size, element;
    while (file.good()) {
        file >> size;

        arr = new int*[size];
        for (int i = 0; i < size; i++)
            arr[i] = new int[size];


        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                file >> element;
                arr[i][j] = element;
            }
        }
    }

    return arr;
}

int main()
{
    int** 2dArray;
    Queue<int> Q;

    //...
    // open file
    //...
    2dArray = buildMatrix(file);
    buildQueue(Q, 2dArray);
}
于 2013-02-27T17:56:42.120 に答える
1

関数内で初期配列を割り当てる場合は、それをトリプルポインターとして渡し、次のように変更する必要があります。

*2dArray = new int*[size]

またはintを返します**

そうしないと、新しいメモリへのポインタが失われます。

ポインタは値によって渡されることを忘れないでください。現状では、buildArray()呼び出し後も有効なメモリへのポインタはありません。

于 2013-02-27T18:00:10.297 に答える
0

関数に引数で渡されたポインタを割り当てるときは、コピー値のみを変更します。C / C ++では、パラメーターを関数に送信すると、このコピーが作成されます。したがって、以前の他の回答のように、ポインタをに変更void buildArray(...)int** buildArray(...)たり、ポインタにポインタを送信したりすることで、ポインタの新しい値を返すことができます(難しいように見えます)。または、最後に、C ++を使用しているため、参照を送信できます。void buildArray(ifstream &file, int**& 2dArray)また、2dArrayはメインからの実際のポインターになるため、コードを変更せずに値を変更する必要があります。

于 2013-02-27T22:36:05.427 に答える