Длина массива строк в функции

Я знаю, что этот вопрос задавали тысячу раз, но я не могу найти решение для своего случая.

Чтобы получить длину массива строк в заданной функции. Это для платы 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-го элемента массива)

, 👍0


1 ответ


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

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++) {
    ...
}
,

хм, ок интересно. Но как мне рассчитать длину любого заданного массива, переданного в myFunction? В примере у меня было только mainMenu, но если у меня несколько меню, я хочу программно получить его длину, @will.mendil

Вы не можете. Вы должны вычислить его где-то, где массив все еще является массивом (точка, где он определен), и передать это значение в качестве параметра., @Majenko

В самом деле? так что нет функции, похожей на go или python с len (x) или length (x)?, @will.mendil

Нет. Такой функции нет. Просто потому, что Си так не работает., @Majenko

@will.mendil Я добавил для вас в свой ответ несколько часто используемых методов., @Majenko

Только что увидел, что цикл for должен работать. Я действительно привык к python и влюбился в go через несколько месяцев. Но для того, что я делаю, tinygo не подойдет, так как в нем отсутствуют некоторые функции. Я борюсь с C, так как он работает совсем по-другому. в любом случае спасибо за помощь, @will.mendil