Стеки в массивах в массивах

array led-strip

Я пытаюсь найти «ванильный» способ записи нескольких массивов в один. Я потратил много времени на поиски того, как это сделать, но все, что приходит, — это либо учебник, в котором не рассматривается конкатенация, либо чей-то вопрос, который в конечном итоге оказался несвязанной синтаксической проблемой.

Я соединил несколько цепочек светодиодов 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]

Есть идеи, возможно ли это или о каком языке я думаю?

, 👍0

Обсуждение

Двумерный массив технически сохраняется сериализованным как длинный одномерный массив. Должна быть возможность читать/записывать каждый подмассив, а также весь одномерный массив с помощью указателя. Возможно, сегодня у меня будет время написать на этот вопрос целый ответ., @chrisl


1 ответ


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

3

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], чтобы получить четвертую полосу.

Есть еще несколько способов, но я думаю, что этот вам поможет.

,