как работать с массивами?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

sadman41 пишет:

 

Не путайте человека, он и сам запутается :))

Зачистить массив - это одно, а сделать пустую строку - другое (по смыслу). Потом будете объяснять, как из "пустого массива" куча разнообразных значений вылавливается.

2ТС: массив байтов и нуль-терминированная строка, которая применяется в Си, в сущности одно и то же - выделенная область последовательно идущих ячеек памяти. Встроенные строковые функции работают просто: "просматривают" ячейки памяти от нулевой и далее, не ориентируясь на указанный вами при создании таковой строки размер. Как только в текущей позиции '\0' увидели, то считают, что строка закончилась и завершают работу. А если не увидели, то будут далее просматривать всё по порядку, а это может быть очень долго. 

Однако из этого не следует, что помещение '\0' в нулевую ячейку очищает вообще всю выделенную под массив область памяти. Для реального "обнуления" нужно поместить '\0' во все ячейки, пробежав for-ом по всей длине или с помощью memset(), например. 

Какой из способов выбрать - нужно решать по месту. Например, сделали вы "пустую строку" через '\0' в нулевой ячейки, а потом в нее пихнули что-то из Serial.read(). И вот у вас уже нет строки с точки зрения внутренних функций, работающих со строками и strlen() будет показывать каждый раз безумные числа.

т.е. если я начну читать со 2-й позиции то там так и остануться данные?

sadman41
Offline
Зарегистрирован: 19.10.2016

d13lider пишет:

т.е. если я начну читать со 2-й позиции то там так и остануться данные?

Можете проверить.

Но не считайте совет b707 вредным, этот способ достаточно экономен для progmem space, но должен применяться с учетом происходящих в вашей программе процессов. 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Ну самое главное понял что делает эта функция, и правда мне необходима, потому что мне приходиться читать не с первой позиции

b707
Offline
Зарегистрирован: 26.05.2017

d13lider - ваш код в #47 неверный. а в #49 вы исправились.

Что касается способа "зачистки данных" - замечание sadman41 верное. Способ зависит от того, как вы используете массив buf[]. Если ваша программа трактует buf как массив байт - надо чистить каждый элемент массива, как рекомендует  sadman41. Если это нуль-терминированная строка - достаточно вставить терминатор только в первую (нулевую) позицию, как писал я

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Все понятно и доходчиво, спасибо вам большое