Стеки в массивах в массивах
Я пытаюсь найти «ванильный» способ записи нескольких массивов в один. Я потратил много времени на поиски того, как это сделать, но все, что приходит, — это либо учебник, в котором не рассматривается конкатенация, либо чей-то вопрос, который в конечном итоге оказался несвязанной синтаксической проблемой.
Я соединил несколько цепочек светодиодов WS2812B, соединенных последовательно, чтобы Arduino воспринимал их как одну непрерывную нить. Мне удалось выполнить несколько очень интересных узоров как одну прядь, используя библиотеку Pololu, но я хотел бы запрограммировать пряди отдельно. Количество источников света, которые у меня есть, очень ресурсоемко, и мне нравится, чтобы все было просто, поэтому я ищу совет, как лучше всего объединить массивы без импорта дополнительных библиотек.
Поскольку шаблоны, которые я использовал до сих пор, записывают в массив, а выходные данные представляют собой массив, моей первой мыслью было, что я мог бы записать один шаблон в массив, состоящий из разделов 1, 4 и 5, а другой шаблон, который будут сопоставлены с разделами 2, 3 и 6, а затем объединены по порядку. Однако добавление массивов кажется несколько сложным, не беспокоясь о той или иной любимой библиотеке человека или циклическом переборе одного значения за раз, и я пытаюсь поработать над своими навыками C. Есть ли простой способ объединить массивы или мне лучше об этом подумать? Приветствуются любые лучшие практики или организационные советы. Я хочу писать чистый код.
Бонусный раунд: я использую на работе несколько разных языков и не могу понять, почему мне пришло в голову, что это сработает...
array1 = [a, b, c]
array2 = [x, y]
array3 = array1 + array2
// array3 = [a, b, c, x, y]
Есть идеи, возможно ли это или о каком языке я думаю?
@Alphy13, 👍0
Обсуждение1 ответ
Лучший ответ:
C(++) изначально не позволяет вам «добавлять» такие массивы. Ваш код похож на Python.
Есть несколько способов сделать то, что вы хотите. Вы можете заставить свой код, который записывает шаблон в массив, принимать смещение - чтобы вместо того, чтобы всегда начинать с позиции 0, вы могли бы указать ему, с чего начать.
Вы можете написать функцию для «объединения» массивов или использовать функцию, написанную кем-то другим, если сможете ее найти. Это довольно просто сделать.
Однако метод, который я бы использовал в вашей ситуации, вероятно, просто вопрос предпочтений, заключается в следующем:
Предположим (например) у вас есть 6 лент по 10 светодиодов в каждой. Вам нужно 60 элементов, чтобы представить их все. (Я предполагаю, что каждый элемент представляет собой int
; не помню, так ли это.) Создайте один большой массив для всего набора:
int allElements[60];
Вы можете думать о переменной allElements
как о массиве, но на самом деле это int*
(указатель на int
), при этом этот адрес памяти имеет 59 других адресов памяти после того, как он зарезервирован. C знает, что когда вы говорите allElements[7]
, ему нужно просмотреть 7 символов int
от адреса, на который указывает allElements
. Это означает, что вы можете создавать новые переменные, указывающие на части этого массива, и использовать эти переменные, как если бы они были собственными массивами. Например:
int *firstStrip = &(allElements[0]);
int *secondStrip = &(allElements[10]);
int *thirdStrip = &(allElements[20]);
/* ... and so on */
(Есть более идиоматический способ написать это, который в точности эквивалентен, но я думаю, что приведенное выше будет более понятным, если вы новичок в этом.)
В качестве дополнительного улучшения теперь вы можете заметить, что у вас есть множество переменных с одинаковыми именами и похожими функциями, и вы можете поместить их в массив.
int* Strips[] = { &(allElements[0]), &(allElements[1]), &(allElements[2]) /* и так далее */};
Теперь вы можете использовать strips[3]
, чтобы получить четвертую полосу.
Есть еще несколько способов, но я думаю, что этот вам поможет.
- Возможно ли иметь массив массивов int?
- Библиотека FastLED: Как настроить яркость одного пикселя в абсолютном масштабе?
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Инициализация массива структур
- Невозможно создать массив типа const char*
- Работает ли конструкция int array[100] = {0} на Arduino?
- Управлять несколькими полосками WS2812B с разным количеством светодиодов.
- Массив динамического размера в качестве члена класса
Двумерный массив технически сохраняется сериализованным как длинный одномерный массив. Должна быть возможность читать/записывать каждый подмассив, а также весь одномерный массив с помощью указателя. Возможно, сегодня у меня будет время написать на этот вопрос целый ответ., @chrisl