Опрос define в цикле

Доброго дня. Есть ардуинка, связанная с цифровой клавиатурой. При вводе номера ардуинка должна проверять, если ли номер в памяти, и если есть, сообщить об этом. Номеров до 100 штук разной длинны, от 1 до 11 цифр. Номера только из цифр. Никаких +7 не будет.
И номера эти, необходимо в случае чего относительно просто менять в коде и заливать новую прошивку.

Как подумал Я: сделал отдельный файл “phone numbers.h” и подключил его в начале кода, чтобы если менять номера, то не лезть в основной код.
Внутри файла все номера записать по виду:

#define PHONE_NUMBER_1 1 
#define PHONE_NUMBER_2 22
#define PHONE_NUMBER_3 333
#define PHONE_NUMBER_4 4444

так вот, можно ли проверить все эти номера в цикле for?

по типу

for (int i = 1, i <= 100, i++) {
#ifdef(PHONE_NUMBER_ + i) Serial.println("Такой номер есть");
#ifndef(PHONE_NUMBER_ + i)) Serial.println("Такого номера нет");
}

Или, если так сделать нельзя, то как можно элегантнее сохранить в память до 100 значений? Массив собирать?

С ним взаимодействовать удобно. И не придется препроцессору моск иметь

1 лайк

а камень какой? Памяти-то хватит?

это так не работает. Надо Си учить

1 лайк

Ардуино Мега. В теории должно хватить. Ну и опять же, насколько Я понимаю, дефайн память не занимает, как таковую Он же при компиляции просто заменяет одни строки на другие

Это Я понял, что оно так не работает. Поэтому и создал пост здесь, чтобы более опытные ребята направили в нужную сторону.

вот я и говорю, учебник по С++ тебе надо хороший. В эту сторону и шагай.

1 лайк

Если массив создавать, то в каком формате? Просто если каждый элемент массива это номер, то 11-значный стандартный номер телефона не влезет в одну ячейку.
А если 1 номер распихивать по разным ячейкам, то как сделать элегантный документ со списком номеров, чтобы в будущем его легко было редактировать?

Удивительно, правда?

Так попробуй. Код ниже я не компилировал, это тебе для примера

static char *phone_numbers[] = {
  "86667771122",
 "1684",
 "1",
"999",
NULL,
};

// проверить, есть ли номер /num/ в списке
//
static bool has_number(const char *num) {
  int i = 0;
  if (num && *num)
    while (phone_numbers[i])
      if (!strcmp(phone_numbers[i++]),num)
        return true;
  return false;
}
1 лайк

хранить номера телефонов как текстовые строки

Собственно, номера телефонов это не числа, а скорее метки.

в этом коде сразу два принципиально неверных подхода.

Во-первых, макросы #define вычисляются в момент компиляции, поэтому использовать в них итератор цикла невозможно.

Ну а во-вторых, идея насоздавать кучу переменных типа x_1 x_2 x_3 и потом “вычислять” их имена конкатеацией “х” и номера - в С/С++ не работает.

(хотя как раз для дефайнов это возможно)

По хорошему, массив структур вида код страны и номер. И да, длина номера не всегда 11

Вот с этим сложно))
Я свои 5 номеров на память на знаю. Постоянно в слерозник лезть приходиться. А тут 100. Без кибернетики никак

1 лайк

В AVR есть модификатор PROGMEM чтобы константная переменная располагалась в памяти программы не отнимая ОЗУ (при этом снижается скорость доступа к ней, но это не должно быть критично). Сам я правда его еще ни разу не использовал, но уже читал что есть такое.

В целом получилось. Правда Я так нифига и не понял, как это работает. Но тот, кто в школе физику прогуливал, для того весь мир окружен магией. Так же у меня с программированием.
Надо сейчас основной проект до ума.
Спасибо

Ахахах.

Херня, так весь майкрософт работает

1 лайк

Ага, освобождает и даже добавляет :smiley:

3 лайка

Странные вы советы даёте.
Дефайны вполне себе можно перебирать.
Правда их для этого нужно в массив запихать.

#define NUMBER_ONE 88003255535UL
#define NUMBER_TWO 3222233UL
#define NUMBER_THREE 2147483647UL

uint64_t MY_NUMBERS[]={NUMBER_ONE, NUMBER_TWO, NUMBER_THREE};

И очень странное предложение хранить номера строками.
11 байт оно же короче чем 8, да и строки сравнивать намного проще чем целые числа…
Рука-лицо.

1 лайк