Как получить размер (sizeof) массива структур

Я пытаюсь использовать релейный модуль, мне нужен четкий способ настройки и управления релейным модулем. Я определил структуру и заполнил ее некоторой информацией об идентификаторе, контакте, названии и состоянии реле . Я не могу зацикливаться на for в массиве элементов управления, потому что не могу правильно определить размер массива

typedef struct{
  int id;
  int pin;
  String title;
  bool state;
}  SwitchControl;

SwitchControl controls[2] = {
  {1, 22, "Switch 01", 1},
  {2, 23, "Switch 02", 0},
};


for(int i=0; i<sizeof(controls) - 1; i++){
}

Спасибо

, 👍3

Обсуждение

Это действительно вопрос C ++ больше, чем что-либо еще. На случай, если вам интересно, предварительная обработка исходного кода Arduino никак на это не влияет., @timemage

Попробуйте (sizeof(элементы управления) / sizeof(элементы управления [0]) или лучше (sizeof (элементы управления) / sizeof (SwitchControl)), @Peter Paul Kiefer

for (const auto &e: controls) { или std::size, если у вас так получилось. <shrugs> все еще кажется, что на самом деле это вопрос C ++., @timemage

Я бы закодировал const прямо выше, например, MAX_CONTROL, который сохраняет более поздний код чистым и (я думаю) быстрее, поскольку C ++ не нужно ничего вычислять каждый раз, когда он используется., @dandavis

@dandavis, постоянное выражение, подобное тому, которое включает в себя разделение результата двух операторов sizeof, будет оцениваться во время компиляции практически в любом компиляторе. Или, по крайней мере, те, которые были сделаны примерно после 1992 года или около того., @timemage


3 ответа


0

sizeof(controls) возвращает размер всего объекта в байтах, который не является тем, что вы хотите. Вам нужно количество элементов.

Я отмечу, что, поскольку вы статически распределяете это следующим образом:

Элементы управления SwitchControl[2]

Размер, который вы ищете, всегда будет 2. Так что просто используйте 2 в вашем цикле for, например:

for(int i=0; i<2; i++)

,

На данный момент количество элементов равно 2. Но смысл использования sizeof() со статическим распределением заключается в том, что вы можете легко добавить больше элементов в массив, не изменяя все циклы for в вашем коде. Весьма вероятно, что показанный код OP является всего лишь тестовым кодом, и что конечный код может содержать больше элементов, а количество элементов может меняться между различными итерациями кода. Хотя ваше предложение работает, это не самый лучший совет для этого., @chrisl

Я думаю, вы читаете гораздо больше об этом вопросе, который в настоящее время существует. Да, вы правы, но иногда вам нужно идти, прежде чем вы сможете бежать., @jwh20


3

Чтобы сделать его универсальным, вы просто делите размер массива на размер типа:

for(int i=0; i<sizeof(controls)/sizeof(SwitchControl); i++){
}

Затем вы можете позже изменить элементы, если массив или структура и код будут одинаковыми.

,

2

Более общий способ (используемый в будущих случаях):

// количество элементов в массиве
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

Теперь вы можете использовать ARRAY_SIZE (the_array) в своем коде следующим образом:

for(int i=0; i<ARRAY_SIZE (controls); i++){
}

Все вышесказанное работает как на C, так и на C ++.


Более C ++ способ сделать это - использовать шаблон, подобный этому:

// количество элементов в шаблоне массива
template< typename T, size_t N > size_t ArraySize (T (&) [N]){ return N; }

Теперь arraySize(the_array) возвращает количество элементов в массиве:

for(int i=0; i< ArraySize (controls); i++){
}

"Язык Arduino" - это C ++ с некоторой начальной предварительной обработкой. Во всех смыслах и целях любой учебник по C ++ поможет вам с программированием Arduino (за исключением того, что стандартная библиотека шаблонов (STL) не включена по умолчанию).


Я не знаю, почему вы вычитали 1 в своем опубликованном коде. Разве вы не хотели перебирать весь массив?

,