С++ Вставка объекта 2D-массива в другой

Эта проблема является продолжением предыдущей проблемы:

C++ Возврат и вставка объекта двумерного массива

и настоятельно рекомендуется просмотреть ссылку, чтобы понять следующее.

Я следил за ответом Адама Розенфилда, и он решил первые две проблемы. Однако еще не решена последняя проблема, которая сильно связана с первыми двумя. Я не уверен, проблема в том, как я пытаюсь исправить код, или проблема в том, что делается.

Это часть того, что написано в int main():

    int i, j;

    Grid myGrid;
    Piece myPiece;

    //First two lines of Adam's Code
    int (*arrayPtr)[4][4] = myPiece.returnPiece();
    int cell = (*arrayPtr)[i][j];

    //compiler error
    myGrid.insertArray(cell); <--- Problem

Я не уверен, является ли это неправильным аргументом, или это то, что я пытаюсь сделать неправильно. Это то, что я получаю, когда пытаюсь скомпилировать:

In function `int main()'
invalid conversion from `int' to `int(*)[4][4]'
initializing argument 1 of `void Grid::insertArray(int(*)[4][4])'
[Build Error] [grid test.o] Error 1

Я пробовал это:


myGrid.insertArray((*arrayPtr)[4][4]); //Same Error
myGrid.insertArray((*arrayPtr)[i][j]); //Same Error

Я не знаю, в чем проблема, и не знаю, что делать. Я благодарю Адама и других за помощь с предыдущими проблемами, но кто-нибудь знает, как решить эту последнюю проблему?

"принимать returnpiece() в аргументе insertArray();


person Community    schedule 01.01.2009    source источник
comment
пожалуйста, исправьте код с помощью кнопки 110101 на панели инструментов редактора. iirc, это ваш третий пост, и вы уже должны были это узнать, приятель   -  person Johannes Schaub - litb    schedule 01.01.2009
comment
в любом случае, передайте arrayPtr вместо (*arrayPtr)[4][4] . я не заслуживаю ответа, поэтому я пишу его в разделе комментариев :) не поймите меня неправильно, но вы, вероятно, должны были выяснить это сами, учитывая последний пост Адама, который объяснил, в чем дело.   -  person Johannes Schaub - litb    schedule 01.01.2009
comment
Бакстер: Я только что опубликовал предложение для копирования по значению вместо копирования по ссылке в вашей предыдущей теме. Вы можете просмотреть его.   -  person Mr.Ree    schedule 01.01.2009
comment
какой компилятор/среду вы используете?   -  person Doug T.    schedule 01.01.2009


Ответы (2)


int i, j;

Grid myGrid;
Piece myPiece;

//First two lines of Adam's Code
int (*arrayPtr)[4][4] = myPiece.returnPiece();
int cell = (*arrayPtr)[i][j];

//compiler error
myGrid.insertArray(cell); <--- Problem

Если вы хотите скопировать кусок (или раздел 4x4), вам нужно передать указатель на этот раздел. Функция, которую дал Адам, принимает аргумент типа (int *[4][4]), а не целого числа.

 void Grid::InsertArray(int (*arr)[4][4]) {
      for(int i = 0; i < x_ROWS; i++)
      {
          for(int j = 0; j < y_COLUMNS ; j++)
              squares[i][j] = (*arr)[i][j];
      } 
 }

поэтому вы бы передали его arrayPtr

int i, j;

 Grid myGrid;
 Piece myPiece;

 //First two lines of Adam's Code
 int (*arrayPtr)[4][4] = myPiece.returnPiece();
 myGrid.insertArray(arrayPtr); 

или в одну строку

myGrid.insertArray(myPiece.returnPiece());
person Mark Essel    schedule 05.01.2009

Я вижу несколько проблем:

1) Возможно, вы просто не вырезали и не вставили все, но похоже, что вы устанавливаете cell как (*arrayPtr)[i][j] до того, как i и j получат значение - в C/C++ они не инициализируются автоматически до 0, их значения могут быть чем угодно (часто абсурдно большими/низкими числами, что бы ни случилось в памяти в этом месте раньше).

2) Цель вашей функции insertArray — взять массив и вставить его в другой. Поэтому вы должны передать ему массив. Вместо этого вы передаете ему cell, который является единственным элементом массива. Вы хотите дать ему arrayPtr само по себе. В первой строке кода Адама [4][4] является частью типа массива (в частности, он указывает, что это массив 4x4). Но myGrid.insertArray((*arrayPtr)[4][4]); означает «Взять элемент из 4-й строки и 4-го столбца arrayPtr» — вне объявления переменной [4][4] выполняет фактический поиск элемента. Другой контекст, другой смысл.

3) Примечание по стилю: глядя на ваш последний пост, код для insertArray не выполняет «вставку» в том смысле, в котором это слово обычно используется в программировании. Вставка — это когда вы добавляете элемент в последовательность (например, массив или связанный список), не удаляя ничего из того, что было до этого. Ваш код выполняет копирование, так что copyArray или setArray будут меньше вводить в заблуждение.

person Joseph Garvin    schedule 02.01.2009