Сомнение в использовании массива символов

Я пытаюсь сделать светодиодную вывеску с помощью светодиодной ленты WS2812b, используя библиотеку FastLed (кстати, это отличная библиотека!), я уже могу показывать текст (пока только один, который я оставляю сохраненным в массиве символов в начале программы), но я хотел бы иметь возможность изменять этот текст с помощью последовательного порта Arduino, и вот в чем проблема:

При настройке текста, который будет отображаться в массиве светодиодов, следует использовать следующую функцию:

ScrollingMsg.SetText ((unsigned char *) TxtDemo, sizeof (TxtDemo) - 1);}

Где TxtDemo — это массив символов переменного типа.

Пока здесь все правильно, как я и прокомментировал, я могу показывать текст, но в момент получения данных из последовательного порта и сохранения их в массиве символов TxtDemo, когда я использую функцию sizeof(TxtDemo), полученное мной значение остается с исходным размером (вполне понятным) этого массива.

Например: если исходный текст был (сохранен в TxtDemo): "Привет, мир", функция sizeof() возвращает "11", Но когда я беру то, что хочу показать на последовательном порту, и сохраняю это в переменной TxtDemo, я никак не могу изменить размер этого массива. Так что... что я могу сделать? Что вы мне порекомендуете?

, 👍1


1 ответ


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

4

Массивы в C фиксированы. sizeof() всегда будет возвращать объем выделенной памяти для массива.

Вместо этого следует использовать strlen(), чтобы получить количество символов до (но не включая) завершающего символа NULL в конце строки.

ScrollingMsg.SetText ((unsigned char *) TxtDemo, strlen(TxtDemo));

Убедитесь, что в вашем исходном массиве достаточно места для хранения самой длинной строки, которую вы захотите отправить - она не выйдет за пределы вашего первоначального выделения. Также убедитесь, что в конце вашего допустимого текста есть символ NULL. Слишком легко забыть, что вам нужно вставить его после последнего полученного символа.

,

Спасибо за быстрый ответ... теперь: как добавить нулевой символ???, @k.Cyborg

Я делаю это во время чтения из последовательного порта. Для каждого символа, который я помещаю в массив, я устанавливаю следующую запись на 0. Вот пример: https://majenko.co.uk/blog/reading-serial-arduino, @Majenko

Мужчины... статья просто ОТЛИЧНАЯ!!!! Спасибо!!!, @k.Cyborg

@k.Cyborg Вам также может быть полезно это: https://majenko.co.uk/blog/arrays-pointers-what-c, @Majenko