Скопируйте 2d массив структур c ++ - PullRequest
0 голосов
/ 09 ноября 2018

Я создаю игру "Корабли". Я генерирую mField, который будет моим шаблоном для заполнения вражеского поля кораблями. Для этого я хочу скопировать mField в eField.

Мой mField - это динамический двумерный массив структур "Поле", и он заполняется следующим образом в моем файле cpp:

mField = new Field*[x+3];
    for (int i = 0; i < x+3; ++i)
        mField[i] = new Field[y+3];

И объявлено так в моем заголовочном файле

Field **mField;

Теперь для копирования я попробовал

memcpy(&eField, &mField, sizeof(&mField));

хотя теперь, когда я заполняю свое mField кораблями, я вижу во вражеском поле точную копию mField вместо того, чтобы быть чистым полем. Вот как я передаю свое поле в функцию, которая меняет мое поле:

void Map::changeField(int x, int y, string ciag,Field **field) {
    ...
}

Я допустил какую-то ошибку в своей функции из-за того, что она изменяет оба массива, или я неправильно копирую массивы?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

memcpy просто скопировал указатели в ваши базовые массивы. Он не скопировал содержимое , на которое указывают указатели.

Ваша функция копирования должна выделять новую память и копировать содержимое (иначе глубокая копия):

eField = new Field*[x+3];
for (int i = 0; i < x+3; ++i)
{
    eField[i] = new Field[y+3];
    memcpy(efield[i], mField[i], y+3);
}
0 голосов
/ 09 ноября 2018

Вы копируете указатели поля противника на собственное поле, это не сработает, вы делите поля.

Используйте std::vector<Filed>((x+3)*(y+3)), то есть массив полей! D, и получите к нему доступ как 2D.

Если вам нужно использовать 2D-массивы, снова выделите новые поля для каждой строки, как вы делали это раньше (подсказка: создайте функцию, которая создает ваши mField и eField общим способом).

...