Изменение размера динамически размещаемой матрицы - PullRequest
0 голосов
/ 03 апреля 2012

Попытка динамического изменения размера матрицы формы.Это часть программы для рисования, где _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 ]

3 голосов
/ 03 апреля 2012
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] не выделяет достаточно памяти для фактического хранения _frame*_capacity экземпляров Shape.Кроме того, поскольку каждый указатель в массиве указывает на другой массив фиксированного размера , компилятор жалуется на непостоянную _capacity в вашем фрагменте кода.

Вместо использования болезненно запутывающегоShape*** и new[_frames][_capacity] business, используйте std::vector для хранения линейного массива Shape s, затем используйте схему адресации для эмуляции строк и столбцов, например:

// 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 голосов
/ 03 апреля 2012

При доступе к содержимому newData это не newData[k][i], а скорее (*newData)[k][i]

newData это не двумерный массив, это указатель на двумерный массив. Каждое из правил * на момент объявления должно соответствовать одному *, -> или [].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...