改变动态分配矩阵的大小

时间:2012-04-02 22:53:53

标签: c++ matrix

尝试动态调整形状矩阵的大小。这是绘图程序的一部分,其中_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;
    }  //*/
}

2 个答案:

答案 0 :(得分:3)

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

这不符合你的想法。 它只在免费商店中分配一个指向数组的指针数组。假设_capacity是一个常量,数组中的每个指针都是一个指向另一个固定数组的指针,该数组完全保持{{1} } _capacity的实例。这是一张图片:

                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)

表达式Shape没有分配足够的内存来实际保存new Shape[_frames][_capacity] _frame*_capacity个实例。此外,由于数组中的每个指针都指向另一个 fixed 大小的数组,编译器会在代码片段中抱怨非常量Shape

使用_capacity来保存Shape***的线性数组,而不是使用令人困惑的new[_frames][_capacity]std::vector业务,然后使用寻址方案来模拟行和列,像这样:

Shape

答案 1 :(得分:0)

访问newData的内容时,不是newData[k][i]而是(*newData)[k][i]

newData不是二维数组,它是指向二维数组的指针。声明时的每个*的经验法则应与正在使用的*->[]匹配。