Как добавить в массив из 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";
}  

Я пытаюсь добавить в конец массива строк, но это не работает? Как я могу удалить строку из массива?

, 👍0

Обсуждение

Вы не можете добавлять к массиву, так как они имеют фиксированный размер. Вам нужно знать, сколько записей можно ожидать при максимальном количестве, и соответствующим образом определить размер массива. Вам также лучше использовать массивы символов вместо ваших строк, они все равно имеют фиксированный размер., @Sim Son

Tnx Sim-карта. как я могу удалить строку из массива?, @dave

Все, что вы можете сделать, это присвоить элементу areay пустую строку. Невозможно добавить / добавить / удалить элемент массива C, вы можете только изменить значение элемента., @Sim Son

большое вам спасибо за то, что были так полезны., @dave

Обратите внимание, что sizeof(* StrAB) - это не длина строки и не длина массива (вот почему вы, очевидно, пытались исправить это, добавив 1). Тип *StrAB - char[], что эквивалентно char*, поэтому sizeof(*strAB) возвращает то же самое, что и sizeof(void*)., @PMF

спасибо PMF, так как же мне определить длину этого массива?, @dave


1 ответ


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

3

Как указано 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, включая библиотечный код , о котором вы, возможно, не знаете.

,