1

ここで私たちは再びインターネットの良い人々です。

これは私が使用しているコードです:

//This is what is in the header file
int *myArr[]; // A two-dimensional array representing holding the matrix data

//This is what is in the definition file
Matrix::Matrix(int n, int m)
{
    myRows = n;
    myColumns = m;
    initialize();
}

void Matrix::initialize()
{
    *myArr = new int[myRows];

    for (int i=0; i < 3; i++)//Only set to 3 since myRows is acting crazy
    {
        myArr[i] = new int[myColumns];
    }
}

何らかの理由で、myRows変数を使用してmyArr配列を作成すると、以前に指していた値の参照が停止しているように見えます。

たとえば、値3を指定し、* myArr = new int [myRows]が実行された後、myRowsの値を9834496に変更します。これはわかりません。

「新しい」は変数か何かを参照解除しますか?それとも私は何か間違ったことをしていますか?

ああ、これは学校の練習プロジェクトなので(あなたが答えなくてもあなたを責めることはありません)、将来のプロジェクトで何が間違っていたかを知ることができるように、作業コードよりも答えを好みます。

4

4 に答える 4

2
int *myArr[];

これは間違っています!ポインタの配列のサイズもコンパイラに通知する必要があります。宣言したらどうでしょうint a[]。サイズが不明なintの配列を作成するようにコンパイラーに指示していますが、これはC++では許可されていません。それがあなたがそれをすることができない理由です。

私はあなたにこれをすることを提案します:

int **myArr;

void Matrix::initialize()
{
    myArr = new int*[myRows]; //note int* here!

    for (int i=0; i < myRows; i++)
    {
        myArr[i] = new int[myColumns];
    }
}

これでうまくいくはずです。

于 2011-01-14T16:06:26.633 に答える
2

std ::vector<>を使用する必要があります。これは、メモリの割り当てと割り当て解除のすべての問題を処理します。そしてそれはバグなしでそうします。

そして、アルゴリズムの本当の目標に集中します。メモリ管理ではありません:-)

typedef std::vector<int> Ints;
typedef std::vector<Ints> Matrix;
Matrix myArray;
于 2011-01-14T16:07:55.603 に答える
2

交換してみてください:

*myArr = new int[myRows];

myArr = new int*[myRows];
于 2011-01-14T16:08:59.363 に答える
0

プロジェクトでマルチレベルポインタを使用する必要があるかどうかはわかりません。この問題に取り組む別の方法がない場合は、多次元配列を1つの大きなフラット配列として扱うだけです。

つまり、行の終わりに達すると、その後のインデックスが次の行の最初の要素になります。コードは次のようになります。

// In this approach the double pointer int**
// is replaced with just a simple int*
int *myArr;

// Here's your Matrix ctor. Note the use of the initializer list
Matrix::Matrix(int n, int m) : myRows(n), myColumns(m)
{
    initialize();
}

void Matrix::initialize()
{
    myArr = new int[myRows * myColumns];

    /* This loop is no longer needed since we're allocating 
       one big chunk at once.
    for (int i=0; i < 3; i++)//Only set to 3 since myRows is acting crazy
    {
      myArr[i] = new int[myColumns];
    }
    */
}

// To retrieve stuff from your array
// you would do something like this:
int Matrix::operator() (const int x, const int y)
{
  return myArr[x * myRows + y];
}
于 2011-01-17T07:54:49.897 に答える