Инициализация массива в структуре

Вижу похожие темы. Но там всё накручено, у меня же примитивщина.
Почему я не могу по людски инициализировать массив в структуре?

typedef struct {
  int8_t  duration[4];
  bool    alarm_enable;
  uint8_t timer;
} set_t;


set_t set = {
  // set.duration[]   = {1,2,3,4}, //wtf?
  set.duration[4]  = 1,2,3,4,
  set.alarm_enable = true,
  set.timer        = 25
};


void setup() {
  Serial.begin(9600);
  Serial.println("Struct test " __DATE__ " " __TIME__);

  uint8_t* sp = (uint8_t*)&set;
  for (uint8_t i = 0; i < sizeof(set); i++)
    Serial.println(*sp++);
}


void loop() {
}
typedef struct {
  int8_t  duration[4];
  bool    alarm_enable;
  uint8_t timer;
} set_t;

// Правильная инициализация
set_t set = {
  .duration    = {1, 2, 3, 4},  // Вот так!
  .alarm_enable = true,
  .timer        = 25
};

а [4] это обращение к 5тому начиная с 0!

а вот так

(не проверял)

Да, так всё класс. Плохо только что если в структуре много элементов, то можно ошибиться. Либо же нужно комментировать каждый элемент.

Это при присвоении, а здесь инициализация (если я не ошибаюсь?).

вариант от @BABOS с именованными полями тоже должен работать

С виду должен, но:


struct:15:3: error: expected primary-expression before '.' token

   .duration[]   = {1,2,3,4}, //wtf?
   ^
struct:15:13: error: expected primary-expression before ']' token
   .duration[]   = {1,2,3,4}, //wtf?
             ^
exit status 1
expected primary-expression before '.' token

вы 5 элементу, под номером 4, присваиваете цифру 1… а далее перечисляете просто числа))) которые не понять компилятору… и лишняя запятая еще там… это так я вижу))) а как оно на самом деле не знаю, может кто то другой объяснит…
создайте массив, {} и в нем сделайте инициализацию

duration[] = {1,2,3,4}, вот тут лишнее []

в общем я просто помочь быстро, если надо))) а как там эта магия работает на самом деле… не знаю)))

Да, точно. Опечатался.( Совсем плохой.(

У меня компилируется без проблем

set_t set = {
  
  .duration  = {1,2,3,4},
  .alarm_enable = true,
  .timer        = 25
};

Я уже исправился.)
Но у меня и в начальном сообщении результат нормальный, не нравится только форма инициализации массива. Через одно место как то.(

Да, он компилируется. Но запись выглядит криво и я не уверен, что оно инициализируется куда надо.

Ну так и на выходе было бы другое?

Struct test Feb 27 2026 13:05:40
1
2
3
4
1
25

ну значит повезло :slight_smile:

)) Ну да, жаль только что компилятор ничего не пишет в этом случае.(
Бабосу нужно поставить 5. Он первый написал правильно.)