2011-01-14 3 views
1

ここでも私たちは再びインターネットの良い人です。変数が動的配列(C++)で使用されているときに変数が参照解除されているようです

//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]; 
    } 
} 

を何らかの理由で、私はちょうどそれが前を向いていた値を参照して停止するようだmyArr配列を作成するmyRows変数を使用する場合:

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

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

「新しい」変数の参照を解除しますか? または何か間違っていますか?

ああ、これは学校の練習プロジェクトです(回答しないとあなたのせいにしません)。私は将来のプロジェクトで間違っていたことを知るために、作業コードの回答が好きです。

+0

したがって、myArr変数はint *の配列ですか? – ThePragmatist

+0

シンプルで難しいアプローチは、ベクトルのベクトルを使用することです。まだまだ醜いですが、はるかに優れています。 –

+0

私が理解しているように、myArrはポインタのポインタです。しかし私は間違っている可能性があります。 – Siemsen

答えて

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]; 
    } 
} 

これが機能するようになりました。

+0

私はそれも間違っていると思う...具体的には、 'myArr = new int [myRows];'は 'int'の行を作成し、そこに必要な' int * '値を格納するのに十分な。 –

+0

私はこれを働かせました。私はなぜint * myArr []をなぜ正確に理解できませんが、間違っている、私はサイズを宣言しないでください* myArr = new int [myRows]; ? – Siemsen

+1

@トニー:どういうことですか?コメントする前に私のコードを慎重に見てください。 :-) – Nawaz

2

std :: vector <>を使用する必要があります。メモリの割り当てと解放のすべての問題を扱います。 それはどんなバグもありません。

そして、アルゴリズムの本当の目標に集中してください。メモリ管理上

typedef std::vector<int> Ints; 
typedef std::vector<Ints> Matrix; 
Matrix myArray; 
+0

学校プロジェクトであることを考えると、既存のコンテナをラップします。学習とすべてのこと:) – genpfault

+0

しかし、私はそれがマルチレベルのポインターの魔法で良いことは良いとは思わない。私の視点。結局のところベクトルは標準のC++ライブラリの一部です;-) –

+1

私はベクトルを使って同様のプロジェクトを行っていましたが、このプロジェクトはgenpfaultの言う通りです。動的マルチ配列を使用する必要があります – Siemsen

2

:-)して交換してみてくださいません:

*myArr = new int[myRows]; 

myArr = new int*[myRows]; 
+1

それでは不十分です。彼のmyArr宣言は間違っています! – Nawaz

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]; 
}