Объявление и использование массива структур в Arduino
Выводя структурные переменные, я получаю значения по умолчанию. Что не так с моим кодом?
struct SCENARIO
{
int Lamp_Pin = -1;
int PB_Pin = -1;
} ;
SCENARIO _red;
SCENARIO _yellow;
SCENARIO _white;
SCENARIO _stop;
SCENARIO btns[4] = { _red, _yellow, _white, _stop};
void setup()
{
_stop.Lamp_Pin = 8;
_stop.PB_Pin = 4;
///// инициализация других 3 объектов, т.е. red & белый и усилитель; желтый
////
for (int i = 0; i < 4; i++)
{
Serial.print(i);Serial.print(":");
Serial.print(btns[i].Lamp_Pin);Serial.print(":");
Serial.println( btns[i].PB_Pin );
//pinMode( btns[i].Lamp_Pin, OUTPUT);
//pinMode( btns[i].PB_Pin, INPUT);
}
}
На изображении ниже показано, что я получаю. Кажется, я не инициализировал переменные!
2 ответа
Проблема в том, что структура обрабатывается как тип значения, а не как ссылочный тип.
Это означает, что создается копия _stop
и помещается в btns
(фактически btns[3]
).
Итак, вам нужно поместить указатели в массив btns
:
SCENARIO* btns[4] = { &_red, &_yellow, &_white, &_stop};
Символ * обозначает указатель, а & означает адрес переменной (поэтому он указывает на переменную и не является копией).
Теперь, когда вы меняете _stop
, также btns[3]
, указывающий на _stop
, будет показывать правильное инициализированное значение.
Для печати следует использовать:
Serial.println( (*btns[i]).LampPin);Serial.print(":");
Serial.println( (*btns[i]).PB_Pin );
Поскольку *btns[i] является указателем, но так как это очень часто используемая функция, можно использовать специальную запись:
Serial.print(btns[i]->Lamp_Pin);Serial.print(":");
Serial.println( btns[i]->PB_Pin);
В этой строке:
SCENARIO btns[4] = { _red, _yellow, _white, _stop};
вы делаете 4 копии структур и размещаете их в массиве.
Вместо этого вы должны либо создать массив напрямую со значениями:
SCENARIO btns[4] = {
{-1, -1},
{-1, -1},
{-1, -1},
{8, 4}
};
И использовать только массив или использовать указатели в массиве:
SCENARIO *btns[4] = { &_red, &_yellow, &_white, &_stop };
а затем обращаться к записям как к указателям:
Serial.print(btns[i]->Lamp_Pin);
Serial.print(":");
Serial.println( btns[i]->PB_Pin );
Спасибо. В основном я кодирую на C #, и в этом случае я забыл, что массив структур выглядит иначе, чем управляемый мир!, @Behzad Sedighzadeh
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Поддерживает ли Arduino C++ динамические массивы объектов ?
- Почему структура переменного размера не компилируется в Arduino IDE?
- Получена ошибка недопустимого преобразования из 'const char*' в 'const uint8_t*
- Как масштабировать растровое изображение (массив uint8_t) в Arduino?
- Удалить все элементы из массива
- Как я могу присвоить значение массива символов массиву uint8_t?
- Объединить два 8-битных массива в один 16-битный массив
Спасибо! Исходя из управляемого мира, я забыл поведение указателей!, @Behzad Sedighzadeh
@BehzadSedighzadeh К счастью, в C # их больше не существует, но при программировании устройств более низкого уровня вы не хотите полагаться в основном на автоматическое выделение памяти и сборку мусора, а указатели находятся «прямо в точке (er)»., @Michel Keijzers
Если ответ помог вам, проголосуйте за него (стрелка рядом с вопросом), для лучшего ответа примите ответ (под стрелками рядом с вопросом)., @Michel Keijzers