2D int массив в C ++ - PullRequest
       27

2D int массив в C ++

1 голос
/ 05 октября 2011

Итак, я хочу очень быстро инициализировать массив int 2d, но не могу понять, как это сделать.Я провел несколько поисков, и ни один из них не сказал, как инициализировать двумерный массив, кроме как сделать:

int [SOME_CONSTANT][ANOTHER_CONSTANT] = {{0}};

По сути, у меня есть 8 вершин, и я перечисляю 4 вершиныкаждая грань куба в массиве.Я пробовал это:

int[6][4] sides = {{0, 1, 2, 3}, {4, 5, 6, 7}, {0, 4, 7, 3}, {7, 6, 2, 3}, {5, 1, 2, 6}, {0, 1, 5, 4}};

Но это говорит мне, что есть ошибка с 'сторон', и что он ожидал точку с запятой.Есть ли способ быстро инициализировать массив, как этот?

Спасибо!

Ответы [ 7 ]

7 голосов
/ 05 октября 2011

У вас есть [] [] на неправильной стороне. Попробуйте это:

int sides[6][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {0, 4, 7, 3}, {7, 6, 2, 3}, {5, 1, 2, 6}, {0, 1, 5, 4}};

Имейте в виду, что у вас действительно есть:

int **sides

(указатель на указатель целых). Это стороны, которые имеют размеры, а не int. Поэтому вы также можете сделать:

int x, y[2], z[3][4], ...;
7 голосов
/ 05 октября 2011

Я думаю, что Ты хотел сказать

int sides[6][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {0, 4, 7, 3}, {7, 6, 2, 3}, {5, 1, 2, 6}, {0, 1, 5, 4}};
4 голосов
/ 05 октября 2011

int array[n][m] ведет себя так же, как int array[n * m].

Фактически, array[i][j] = array[m * i + j] для всех i, j.

Таким образом, int array[2][3] = {1, 2, 3, 4, 5, 6}; является допустимым объявлением и, например,

array[1][1] = array[3 * 1 + 1] = array[4] = 5.

2 голосов
/ 05 октября 2011
int sides[6][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {0, 4, 7, 3}, {7, 6, 2, 3}, {5, 1, 2, 6}, {0, 1, 5, 4}}; 

Я не обычный программист на С ++, но, похоже, int sides[6][4], кажется, компилируется, а int[6][4] sides не удается.Такие языки, как C #, позволяют иметь [][] с обеих сторон, но, очевидно, c ++ этого не делает.

1 голос
/ 05 октября 2011

int sides[6][4] = ... должен сделать свое дело.Это звучит так, как будто вы пришли из Java (или другого языка), поэтому я рекомендую книгу C ++ Подробное руководство по книге и список C ++ для получения более подробной информации.

0 голосов
/ 05 октября 2011

Да, предполагаемый тип сторон - int[6][4], но C ++ иногда имеет запутанный синтаксис.Способ объявления указанного массива:

int sides[6][4] = {/*stuff*/};

Вы сталкиваетесь с этим и с указателями на функции, но еще хуже:

int (*myfuncptr)(int); //creates a function pointer called myfuncptr

С помощью указателей на функции вы можете сделать это:

typedef int (*func_ptr_type)(int);
func_ptr_type myfuncptr;

К сожалению, нет никакого волшебного трюка для массивов.

0 голосов
/ 05 октября 2011

Я бы сделал массив вне функции и просто присвоил бы его вашему локальному.это очень вероятно вызовет memcpy или просто встроенный цикл копирования памяти

, это самый быстрый способ получить

...