Присвоение элемента многомерного массива второму массиву

У меня есть два массива. Первый массив представляет собой многомерный массив, содержащий значения цвета.

Второй массив хранит активный цвет из первого массива. Как присвоить элемент из многомерного массива colors второму массиву EXCLUSIVE_COLOR?

int colors[][3] = {
  { 255, 0, 0 },   
  { 0, 255, 0 },   
  { 0, 0, 255 },   
  { 253, 7, 210 }  
};
int EXCLUSIVE_COLOR[3] = {0};

Я попробовал следующее, но ничего не помогло:

    EXCLUSIVE_COLOR = { 
      colors[0][0], 
      colors[0][1], 
      colors[0][2]
    };
    // ошибка: присваивание массиву из списка инициализаторов

    EXCLUSIVE_COLOR = colors[0];
    // ошибка: неверное присвоение массива

, 👍0

Обсуждение

каков тип EXCLUSIVE_COLOR. вам нужен указатель на массив или копию массива?, @Juraj

Любой из них будет работать. EXCLUSIVE_COLOR — массив из 3-х элементов., @McWayWeb

int* EXCLUSIVE_COLOR = цвета[0];. а затем вы можете использовать EXCLUSIVE_COLOR[i], @Juraj

Зачем вы используете двумерный массив, если на самом деле у вас есть одномерный массив элементов Color?, @DataFiddler


2 ответа


Лучший ответ:

1

Вы можете скопировать массив:

EXCLUSIVE_COLOR[0] = colors[0][0];
EXCLUSIVE_COLOR[1] = colors[0][1];
EXCLUSIVE_COLOR[2] = colors[0][2];

но это не работает при инициализации.

Кроме того, вы можете объявить EXCLUSIVE_COLOR как указатель на массив из 3 целых чисел:

int (*EXCLUSIVE_COLOR)[3]; // указатель на массив 3 из int

Затем вы можете указать эту точку на строку 2D-массива либо с помощью присваивая указатель или при инициализации:

int (*EXCLUSIVE_COLOR)[3] = &colors[0];  // инициализация

// Далее в программе:
EXCLUSIVE_COLOR = &colors[1];

Обратите внимание, что при использовании этого указателя вам придется явно разыменовать его:

for (int i = 0; i < 3; i++)
    Serial.println((*EXCLUSIVE_COLOR)[i]);

Обновление: как указал Юрай в комментарии, вместо этого вы можете сделать EXCLUSIVE_COLOR указатель на int. В этом случае вы сделаете это точкой к первому элементу в нужной строке:

int* EXCLUSIVE_COLOR = &colors[0][0];

Преимуществом этого подхода является то, что вы можете использовать указатель» языка для упрощения синтаксиса:

int* EXCLUSIVE_COLOR = colors[0];

// Потом
Serial.println(EXCLUSIVE_COLOR[i]);
,

указатель на указатель? это не выглядит правильно, @Juraj

@Juraj: это не указатель на указатель, это указатель на массив., @Edgar Bonet


0

Используйте массивы только там, где это уместно:

struct Color {byte r, g, b;};
const Color colors[] = {
  {0,255,0},
  {255,0,0}
};
const Color red = colors[1];

Это работает и без const. Но вы должны рассмотреть возможность использования const везде, где это возможно.

,