Длина массива строк в функции
Я знаю, что этот вопрос задавали тысячу раз, но я не могу найти решение для своего случая.
Чтобы получить длину массива строк в заданной функции. Это для платы Arduino.
#define LEN(x) sizeof(x)/sizeof(x[0])
const char* mainMenu[] = {"FirstWord", "SecondWord", " "};
void myFunction(const char** m) {
int a = LEN(m);
/* Do something */
};
void setup(){
myFunction(mainMenu);
};
LEN(m)
отлично работает в функции setup()
. Но в myFunction()
это либо дает мне 1 (я думаю, длина указателя), либо 9 (длина 0-го элемента массива)
@will.mendil, 👍0
1 ответ
Лучший ответ:
Проблема в том, что LEN оценивается локально для каждого использования, заменяя его содержимым. В myFunction
параметр, передаваемый ей, является указателем, а не массивом.
Вам нужно оценить размер один раз и только один раз в контексте, когда массив не свернут в указатель. Обычно это делается сразу же после определения массива:
const char* mainMenu[] = {"FirstWord", "SecondWord", " "};
#define MAINMENU_LEN (sizeof(mainMenu) / sizeof(mainMenu[0]))
Поскольку mainMenu
является глобальным, он всегда доступен, и когда вам требуется длина, вы получаете длину глобального массива.
Если вы хотите, чтобы все было локально, вам придется передать количество элементов в массиве в качестве параметра функции, которая использует эту информацию.
myFunction(mainMenu, MAINMENU_LEN);
Еще одна распространенная альтернатива — использовать некоторый "конец массива" маркер, и вы перебираете свой массив, пока не найдете этот маркер (так работают строки - с \0
для маркера конца массива):
const char* mainMenu[] = {"FirstWord", "SecondWord", " ", 0};
Затем:
for (int i = 0; m[i] != 0; i++) {
...
}
- Как записать последовательность кнопок и сохранить ее в массиве
- Как вернуть значение массива символов в функции Arduino IDE?
- Почему я не могу изменить значения массива, даже если оператор успешно вызван? TFT-сенсорный экран
- Использование массивов, двоичных данных и битового чтения
- Получена ошибка недопустимого преобразования из 'const char*' в 'const uint8_t*
- Хранение значений широты и долготы в виде символов с заданной точностью
- Как преобразовать строку в шестнадцатеричный массив
- Матричный дисплей с Arduino UNO (ПРОБЛЕМА)
хм, ок интересно. Но как мне рассчитать длину любого заданного массива, переданного в
myFunction
? В примере у меня было только mainMenu, но если у меня несколько меню, я хочу программно получить его длину, @will.mendilВы не можете. Вы должны вычислить его где-то, где массив все еще является массивом (точка, где он определен), и передать это значение в качестве параметра., @Majenko
В самом деле? так что нет функции, похожей на go или python с len (x) или length (x)?, @will.mendil
Нет. Такой функции нет. Просто потому, что Си так не работает., @Majenko
@will.mendil Я добавил для вас в свой ответ несколько часто используемых методов., @Majenko
Только что увидел, что цикл for должен работать. Я действительно привык к python и влюбился в go через несколько месяцев. Но для того, что я делаю, tinygo не подойдет, так как в нем отсутствуют некоторые функции. Я борюсь с C, так как он работает совсем по-другому. в любом случае спасибо за помощь, @will.mendil