Как получить размер (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++){
}
Спасибо
@Moktar, 👍3
Обсуждение3 ответа
sizeof(controls) возвращает размер всего объекта в байтах, который не является тем, что вы хотите. Вам нужно количество элементов.
Я отмечу, что, поскольку вы статически распределяете это следующим образом:
Элементы управления SwitchControl[2]
Размер, который вы ищете, всегда будет 2. Так что просто используйте 2 в вашем цикле for, например:
for(int i=0; i<2; i++)
На данный момент количество элементов равно 2. Но смысл использования sizeof()
со статическим распределением заключается в том, что вы можете легко добавить больше элементов в массив, не изменяя все циклы for в вашем коде. Весьма вероятно, что показанный код OP является всего лишь тестовым кодом, и что конечный код может содержать больше элементов, а количество элементов может меняться между различными итерациями кода. Хотя ваше предложение работает, это не самый лучший совет для этого., @chrisl
Я думаю, вы читаете гораздо больше об этом вопросе, который в настоящее время существует. Да, вы правы, но иногда вам нужно идти, прежде чем вы сможете бежать., @jwh20
Чтобы сделать его универсальным, вы просто делите
размер массива на размер типа:
for(int i=0; i<sizeof(controls)/sizeof(SwitchControl); i++){
}
Затем вы можете позже изменить элементы, если массив или структура и код будут одинаковыми.
Более общий способ (используемый в будущих случаях):
// количество элементов в массиве
#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 в своем опубликованном коде. Разве вы не хотели перебирать весь массив?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Замена нескольких выводов pinMode() и digitalWrite() на массив
- Инициализация массива структур
- Работает ли конструкция int array[100] = {0} на Arduino?
- Передавать данные структуры во внешнюю структуру через serial?
- Массив динамического размера в качестве члена класса
- Итерация массива объектов
- Работает с gcc, но не с Arduino. ошибка: taking address of temporary array
Это действительно вопрос C ++ больше, чем что-либо еще. На случай, если вам интересно, предварительная обработка исходного кода Arduino никак на это не влияет., @timemage
Попробуйте
(sizeof(элементы управления) / sizeof(элементы управления [0])
или лучше(sizeof (элементы управления) / sizeof (SwitchControl))
, @Peter Paul Kieferfor (const auto &e: controls) { или std::size, если у вас так получилось. <shrugs> все еще кажется, что на самом деле это вопрос C ++., @timemage
Я бы закодировал const прямо выше, например,
MAX_CONTROL
, который сохраняет более поздний код чистым и (я думаю) быстрее, поскольку C ++ не нужно ничего вычислять каждый раз, когда он используется., @dandavis@dandavis, постоянное выражение, подобное тому, которое включает в себя разделение результата двух операторов sizeof, будет оцениваться во время компиляции практически в любом компиляторе. Или, по крайней мере, те, которые были сделаны примерно после 1992 года или около того., @timemage