Двумерный массив

Здравствуйте!

Что-то сообразить не могу.

Есть несколько массивов разной длины, скажем:

uint8_t xArray_Hour_00[] = PROGMEM                  {   44, 43, 42, 41  };
uint8_t xArray_Hour_01[] = PROGMEM                  {   0, 1  };
uint8_t xArray_Hour_02[] = PROGMEM                  {   40, 39, 38  };

Можно ли сделать двумерный массив с этими данными?

Вопрос задан так, что на него можно ответить как угодно:

  1. да, можно;
  2. нет нельзя.

Вам какой ответ нужен? Выбирайте.

А если хотите конкретику, то уточняйте вводные. Например, “допустимы ли “пустые” (неиспользуемые) ячейки в двумерном массиве?”. Или, скажем: “допустимо ли использовать дополнительный одномерный массив указателей размером в количество Ваших “массивов разной длины”?

Без ответов на эти вопросы, разговор ни о чём и ответ может быть любым.

Виноват.

Два вопроса:

1.Гугл говорит, что объявить так нельзя. Да?

uint8_t Massiv[12][];
  1. Допустимы ли “пустые” (неиспользуемые) ячейки в двумерном массиве?

Я не знаю, что говорит гугл, я у него не спрашивал.

Второго вопроса не увидел. Там вроде в сообщении только мой к Вам вопрос остался.

Да.
А как может быть иначе? Хотите - используете, хотите - нет. И от размерности массива это никак не зависит.

Проще простого :smiling_face_with_horns: :

uint8_t xArray_Hour2D[][] = {

{44, 43 , 43} , { 41, 0, 1}, { 40, 39, 38}

};

Допустимы неиспользуемые. В задачу программиста входит занесение туда таких значений, которые алгоритмом будут восприниматься как “ничего”. Либо алгоритму известны адреса (или закон адресации) заполненных и пустых ячеек. Ибо для кода нет пустоты в данных - только числа.

Надо бы поинтересоваться, что вообще алгоритм делает. Вы своим примером данные из нулевого часа закинули в первый. Технически синтаксис верный, но логика нарушена (о которой можно только догадываться). Тут, кажется, опять сейчас будут штаны через голову надевать. Пошел за попкорном.

Фу, какой отсталый! Пропустишь ведь кучу интересного, пока ходишь! Доставка – наше фсё!

Зачем это? Я ответил на поставленый вопрос :slight_smile:

У меня профдеформация. С такими бывает вопросами приходят!.. Ответить, вроде, просто и быстро, но, копнув, открывается провал в кроличью нору…

Это Вам так кажется.

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

uint8_t xArray_Hour2D[][] = {
	{44, 43 , 43},
	{ 41, 0, 1},
	{ 40, 39, 38}

};

void setup(void) {}
void loop(void) {}

То получите совершенно справедливый отлуп:

error: declaration of ‘xArray_Hour2D’ as multidimensional array must have bounds for all dimensions except the first

2 лайка

нет, все строки двумерного массива должны иметь одинаковую длину

“I’m sure you deliver like D H L

But when I deliver I’m doing it well.” (c) из песенки . Каждый топик на форуме должен доставлять!

Ах ты ж.

ну значит [3][3]. Двумерный массив три на три. Звучит интригующе

Можно. Но короткие массивы придется удлиннить. Неиспользуемым значением, как уже написали. Например, вы никогда не используете 255.

Можете тогда дополнить массив 01 до {0, 1, 255, 255} а массив 02 до {40, 39, 38, 255}

Тогда можно будет написать (если 3 и 4 только местами не перепутал):

uint8_t xArray_Hour2D[3][4] = {
 {   44, 43, 42, 41  };
 {   0, 1, 255, 255  };
 {   40, 39, 38, 255  };
};

что, прям с точкой с запятой после каждой строки? :slight_smile:

uint8_t xArray_Hour2D[3][4] = {
 {   44, 43, 42, 41  };  // <<<<<  ?????

Что касаемо размера…
Поскольку вы явно указываете размер массива, то можно и не инициализировать лишние значения:

uint8_t xArray_Hour2D[3][4] = {
 {   44, 43, 42, 41  },
 {   0, 1 },
 {   40, 39, 38  }
};

Компилятор их заполнит… чем-нибудь :slight_smile:

Да, я поражаюсь, казалось бы, после №12 уже ж можно было понять, что лучше попытаться скомпилировать прежде, чем выкладывать? И почему это не делается?

лучше “три и три”. В армии это “положенный уставом зазор между полотёром и полом” :slight_smile:

2 лайка

Всем спасибо!

ИИ подсказал, что можно сделать

“Реализация “зубчатого” массива с помощью указателей”

Так и попробую. Тему можно закрывать.