Как добавить в массив из String в ардуино?
Вот мой код:
char *StrAB[] = {"29 EC C7 C1", "69 5B C9 C2", "22 3B 83 34", "12 BF BF 34", "C6 78 8E 2C" };
void setup() {
Serial.begin(9600);
}
void loop() {
for (int i = 0; i < sizeof(*StrAB)+1; i++)
{
Serial.println(StrAB[i]);
delay(1000);
}
Serial.println(sizeof(*StrAB)+1);
StrAB[sizeof(*StrAB)+1]= "00 00 00 00";
}
Я пытаюсь добавить в конец массива строк, но это не работает? Как я могу удалить строку из массива?
@dave, 👍0
Обсуждение1 ответ
Лучший ответ:
Как указано Sim Son в комментарии, массив - это структура данных фиксированного размера в C ++. Таким образом, вы должны заранее выбрать подходящий размер, а затем отслеживать, какая часть массива фактически используется. Например:
const int AB_max = 10; // емкость массива
const char *AB_str[AB_max] = {"29 EC C7 C1", "69 5B C9 C2",
"22 3B 83 34", "12 BF BF 34", "C6 78 8E 2C"};
int AB_count = 5; // используемые слоты
Чтобы добавить строку в этот массив, вы записываете ее в следующий доступный слот. Но сначала вы должны убедиться, что еще есть свободное место:
void AB_add(const char *s) {
if (AB_count < AB_max)
AB_str[AB_count++] = s;
}
Если вы хотите удалить элемент (кроме последнего), вам придется
переместить все следующие элементы вниз по массиву. Memmove() меммоув()
для этого пригодится функция:
void AB_remove(const char *s) {
// Найдите индекс s.
int i;
for (i = 0; i < AB_count; i++)
if (strcmp(s, AB_str[i]) == 0) break;
// Ничего не делайте, если не найдено.
if (i == AB_count) return;
// Переместите последующие элементы вниз по массиву.
memmove(&AB_str[i], &AB_str[i+1],
(AB_count - (i + 1)) * sizeof *AB_str);
AB_count--;
}
Обратите внимание, что перемещение этих элементов вниз может быть дорогостоящим, если массив довольно длинный. В этом случае массив может оказаться не самой лучшей структурой данных для вас. Однако я бы не стал беспокоиться, если бы речь шла всего о дюжине предметов или около того.
Вот теперь небольшой тест для всего вышеперечисленного:
void AB_print() {
Serial.print("AB: ");
Serial.print(AB_count);
Serial.println(" items");
for (int i = 0; i < AB_count; i++) {
Serial.print(" ");
Serial.println(AB_str[i]);
}
Serial.println();
}
void setup() {
Serial.begin(9600);
AB_print();
AB_add("00 00 00 00");
AB_print();
AB_remove("12 BF BF 34");
AB_print();
}
void loop() {}
Обратите внимание, что это очень “С” стиль ведения дел. Если вы хотите перейти на
более идиоматичный C ++, вы можете начать с помещения всего, что названо
с префиксом AB_
внутри класса.
Если вам действительно нужен массив, в котором вы можете изменять длину, вы можете
выделить его с помощью функции malloc()
и изменить его размер с помощью функции realloc()
. Однако эти
функции не очень удобны для устройств с ограниченным объемом памяти.
Таким образом, их часто избегают во встроенном мире. Они также могут плохо
работать с кодом, использующим new
и delete
, включая библиотечный код
, о котором вы, возможно, не знаете.
- Нужна помощь с EEPROM, не сохраняющим значения массива на ESP8266 после перезапуска
- Как отправить int массив с запросом ESP8266 http post?
- Как отсортировать строку с числом по возрастанию
- Ничего не получено от функции, возвращающей массив строк
- Ожидаемый неквалифицированный идентификатор перед «общедоступным»
- Почему заполнение большого массива символов приводит к сбою? (ESP8266)
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
Вы не можете добавлять к массиву, так как они имеют фиксированный размер. Вам нужно знать, сколько записей можно ожидать при максимальном количестве, и соответствующим образом определить размер массива. Вам также лучше использовать массивы символов вместо ваших строк, они все равно имеют фиксированный размер., @Sim Son
Tnx Sim-карта. как я могу удалить строку из массива?, @dave
Все, что вы можете сделать, это присвоить элементу areay пустую строку. Невозможно добавить / добавить / удалить элемент массива C, вы можете только изменить значение элемента., @Sim Son
большое вам спасибо за то, что были так полезны., @dave
Обратите внимание, что
sizeof(* StrAB)
- это не длина строки и не длина массива (вот почему вы, очевидно, пытались исправить это, добавив 1). Тип*StrAB
-char[]
, что эквивалентноchar*
, поэтомуsizeof(*strAB)
возвращает то же самое, что иsizeof(void*)
., @PMFспасибо PMF, так как же мне определить длину этого массива?, @dave