Объявление и использование массива структур в 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);
  }
}

На изображении ниже показано, что я получаю. Кажется, я не инициализировал переменные!

, 👍0


2 ответа


1

Проблема в том, что структура обрабатывается как тип значения, а не как ссылочный тип.

Это означает, что создается копия _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);
,

Спасибо! Исходя из управляемого мира, я забыл поведение указателей!, @Behzad Sedighzadeh

@BehzadSedighzadeh К счастью, в C # их больше не существует, но при программировании устройств более низкого уровня вы не хотите полагаться в основном на автоматическое выделение памяти и сборку мусора, а указатели находятся «прямо в точке (er)»., @Michel Keijzers

Если ответ помог вам, проголосуйте за него (стрелка рядом с вопросом), для лучшего ответа примите ответ (под стрелками рядом с вопросом)., @Michel Keijzers


1

В этой строке:

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