Как получить доступ к членам структуры в соответствии с целым числом переменной в C? - PullRequest
8 голосов
/ 20 мая 2009

Предположим, у меня есть это struct (которое, кстати, содержит битовые поля, но вам все равно):

struct Element {
    unsigned int a1 : 1;
    unsigned int a2 : 1;
    ...
    unsigned int an : 1;
};

и я хочу получить доступ к члену i'th удобным способом. Давайте рассмотрим поисковое решение.
Я придумал эту функцию:

int getval(struct Element *ep, int n)
{
    int val;
    switch(n) { 
         case 1: val = ep->a1; break;
         case 2: val = ep->a2; break;
         ...
         case n: val = ep->an; break;
    }
    return val;
}

Но я подозреваю, что есть гораздо более простое решение. Может быть, что-то вроде стиля доступа к массиву.

Я пытался сделать что-то подобное:

 #define getval(s,n)   s.a##n

Но, как ожидается, это не сработает.
Есть ли лучшее решение?

Ответы [ 12 ]

0 голосов
/ 20 мая 2009

Почему бы не встроить getval() в структуру?

struct Whang {
    int a1;
    int a2;
    int getIth(int i) {
        int rval;
        switch (i) {
            case 1: rval = a1; break;
            case 2: rval = a2; break;
            default : rval = -1; break;
        }
        return rval;
    }
};    

int _tmain(int argc, _TCHAR* argv[])  
{  
        Whang w;  
    w.a1 = 1;  
    w.a2 = 200;

    int r = w.getIth(1);

    r = w.getIth(2);

    return 0;
}

getIth() знал бы о внутренностях Whang и мог справиться со всем, что в нем содержалось.

0 голосов
/ 20 мая 2009

Если структура действительно так проста, как описано, вы можете использовать объединение с массивом (или приведением к массиву) и некоторую магию доступа к битам (как в Как вы устанавливаете, очищаете и переключаете один бит в C? ).

Как говорит Джаред, общий случай: hard .

...