Задача инициализации структуры в C - PullRequest
2 голосов
/ 22 сентября 2011

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

ожидаемое первичное выражение до '{' token

Я понимаю, что структура должна "существовать", чтобы принимать значения, и она существует как указатель на единицу. Я хотел бы, чтобы вы объяснили мне, что я делаю неправильно и как достичь своей цели.

struct EventCheckData {
  unsigned long refresh_time;
  unsigned long last_execution_ms; //Can also serve to delay at startup
  byte signal_type;
};

struct ClockData {
    struct EventCheckData event_array[4];
    byte event_count;
    unsigned long last_absolute_time;
    UISignal *warning_signals;
}; 



 void ResetClock(UISignal *warning_signal, struct ClockData *clock_data, unsigned long absolute_time) { 
    if(SignalCheckValue(warning_signal, RESET_CLOCK, 1)) {
        extern volatile unsigned long timer0_overflow_count;
        timer0_overflow_count = 0;
        clock_data->last_absolute_time = absolute_time;
        clock_data->event_count = 3;
        (clock_data->event_array)[0] = { .refresh_time = 3000UL, .last_execution_ms = 0UL, .signal_type = WATER_PUMP_ON};
//      clock_data->event_array[1] = {10000UL, 0UL, EXPORT_LOG};
//      clock_data->event_array[2] = {100000UL, 0UL, EXTERNAL_CONNECTION};
        SignalSet(warning_signal, RESET_CLOCK, 0);
    }
}

Спасибо Пауло Невес

Ответы [ 3 ]

4 голосов
/ 22 сентября 2011

(clock_data->event_array)[0] = { .refresh_time = 3000UL, .last_execution_ms = 0UL, .signal_type = WATER_PUMP_ON}; не является инициализацией. Это назначение.

И вы не можете использовать синтаксис инициализатора в присваивании.

С C99 вы можете использовать составной литерал, например

(clock_data->event_array)[0] = (struct EventCheckData){ .refresh_time = 3000UL, .last_execution_ms = 0UL, .signal_type = WATER_PUMP_ON};
4 голосов
/ 22 сентября 2011

То, как вы его назначаете, выглядит как инициализатор.Вам нужно назначение, попробуйте составной литерал:

clock_data->event_array[0] = (struct EventCheckData){ .refresh_time = 3000UL, ...};
2 голосов
/ 22 сентября 2011

Без каких-либо материалов C99 вы можете просто использовать:

void ResetClock(UISignal *warning_signal, struct ClockData *clock_data, unsigned long absolute_time) { 
if(SignalCheckValue(warning_signal, RESET_CLOCK, 1)) {
  extern volatile unsigned long timer0_overflow_count;
  timer0_overflow_count = 0;
  clock_data->last_absolute_time = absolute_time;
  clock_data->event_count = 3;
  {
    struct EventCheckData a[]={ {3000UL, 0UL, WATER_PUMP_ON},
                                {10000UL, 0UL, EXPORT_LOG},
                                {100000UL, 0UL, EXTERNAL_CONNECTION}};
    memcpy(clock_data->event_array,a,sizeof a);
  }
  SignalSet(warning_signal, RESET_CLOCK, 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...