Как правильно обращаться к элементам структур, объединенных в массивы?

Исходим из того, что переменным в структурах присвоены значения. При компиляции возникает ошибка "request for member ‘base_reg’ in something not a structure or union". Я понимаю, что делаю что-то неправильно с указателями, пробовал разные варианты, но не могу понять как сделать верно. Мой код:

struct element {
    char name[15];
    uint16_t reg;
    uint16_t value;
};    

struct {
    uint16_t reg;          
    uint16_t total;
    struct element eq[500];
} state_1;

struct {
    uint16_t base;         
    uint16_t total;
    struct element eq[200];
} state_2;

size_t * all_state [] = {NULL, &state_1, &state_2};

int main (void) {
    fprintf(stdout, "all_state = %i\n",all_state[1]->reg);
}

Как корректно обращаться к элементам в данном случае? Например reg.


Ответы (1 шт):

Автор решения: Harry

Для начала - вы хотите передавать в массив указателей на size_t указатели совершенно иного типа, да еще и разных типов одновременно. Такое можно разве что сделав указатели на void, с последующим обязательным (и верным!) приведением типа. Да и сами типы структур state_1 и state_2 у вас безымянны...

Словом, конечно, можно вот так:

struct element {
    char name[15];
    uint16_t reg;
    uint16_t value;
};    

struct state_1 {
    uint16_t reg;          
    uint16_t total;
    struct element eq[500];
} state_1;

struct state_2 {
    uint16_t base;         
    uint16_t total;
    struct element eq[200];
} state_2;

void * all_state [] = {NULL, &state_1, &state_2};

int main (void) {

    fprintf(stdout, "all_state = %i\n",((struct state_1 *)all_state[1])->reg);
    fprintf(stdout, "all_state = %i\n",((struct state_2 *)all_state[2])->eq[10].reg);
}

Но получается что-то сверхсложное, так что скорее всего, неверное (в смысле самогО решения, а не конкретного кода).

→ Ссылка