2012-04-02 4 views
-1

動的に形状行列のサイズを変更しようとしています。これは描画プログラムの一部で、_capacityはフレームに描画されるシェイプの数です。動的に割り当てられた行列のサイズを変更する

_capacityについては、新しい形状のエラーを取得するには、式に定数値が必要です。

void ShapeStore::Grow(int minimumCapacity) 
{ 
_capacity = max (minimumCapacity, 2 * _capacity); 
if (_capacity) 
    { 

    Shape ***newData = new Shape[_frames][_capacity]; //figure out this 
    int i; 

    for (int k = 0; k < _frames; k++) 
     for (i=0;i<_count;i++) 
      newData[k][i] = _data[k][i]; 

    delete [] _data; 
    _data = newData; 
    } //*/ 
} 
+3

なぜ」上がりませんあなたは 'std :: vector'を使っていますか? –

+2

サイズ '(num_rows * num_cols)'で 'std :: vector'を使い、' data [col_index +(row_index * num_cols)] 'のようなアドレス体系を使うのはなぜでしょうか? 'Shape *** 'は見るだけで痛いからです。 –

+2

C++の '***'は非常に間違っています。 –

答えて

0

newDataのコンテンツにアクセスする場合、それは

newData

newData[k][i]ないむしろ(*newData)[k][i]は、2次元配列ではない、それは、二次元配列へのポインタです。おおよその目安は、宣言時のそれぞれ*は、*,->、または[]のいずれかを使用して一致させる必要があります。

3
Shape ***newData = new Shape[_frames][_capacity]; //figure out this 

これは、あなたがそう考えるものではありません。 フリーストアの配列へのポインタの配列のみを割り当てます。_capacityが定数であると仮定すると、配列内の各ポインタは、正確に_capacityのインスタンスがShapeである別の固定配列へのポインタです。ここで絵です:

 
       index 
      +-----------+ 
newData --> |  0  | (pointer to a fixed array of _capacity instances of Shape) 
      +-----------+ 
      |  1  | (pointer to a fixed array of _capacity instances of Shape) 
      +-----------+ 
      |  2  | (pointer to a fixed array of _capacity instances of Shape) 
      +-----------+ 
      |   | 

       ....... 

      |   | 
      +-----------+ 
      | _frames-1 | (pointer to a fixed array of _capacity instances of Shape) 
      +-----------+ 
(This is the only thing that is actually allocated) 

表現new Shape[_frames][_capacity]は、実際にShape_frame*_capacityのインスタンスを保持するのに十分なメモリを割り当てません。また、配列内の各ポインタはの固定配列の配列を指しているため、コードスニペット内の非定数_capacityについてコンパイラが不平を言います。代わりに、このように、行と列をエミュレートするためのアドレス指定方式を使用し、その後、Shape秒のリニアアレイを保持するためにstd::vectorを使用し、痛々しいほど混乱Shape***new[_frames][_capacity]ビジネスを使用しての

// Exposition only 

std::vector<Shape> data; 

void ResizeMatrix(std::vector<Shape>& data, int frames, int capacity) 
{ 
    data.resize(frames * capacity); 
} 

// Populate data with Shapes 

void IndexMatrix(int capacity_index, int frame_index, int capacity) 
{ 
    Shape& aShape = data[capacity_index + (capacity * frame_index)]; 
    // Do something with it 
} 
+0

クイックフィードバックに感謝します。先ほどのベクトルを使って試したところ、形状が抽象クラスであるため、抽象クラスをインスタンス化できなかったというエラーがありました。彼らに別の表情を与えるだろう。ありがとう! – user1309174

関連する問題