C ++ Вставка 2D объекта массива в другой - PullRequest
0 голосов
/ 01 января 2009

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

C ++ Возврат и вставка объекта 2D-массива

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

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

Это часть того, что написано в 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 ();

Ответы [ 2 ]

1 голос
/ 05 января 2009
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());
0 голосов
/ 02 января 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 будут меньше вводить в заблуждение.

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