2014-09-09 3 views
-6

Я хочу передать значения макросу через цикл for, но когда я пытаюсь передать значения, он дает ошибку, пожалуйста, помогите m как можно быстрее. Когда значения i передаются макросу Valve (я) дает ошибкуПередача значений макросам по циклу

мой код ниже:

#define Valve(x) stTest.bValve##x##_Cmd 

typedef struct OperationFlags 
{ 
    int bValve1_Cmd; 
    int bValve2_Cmd; 
}FLAGS_TypeDef; 

void main(void) 
{ 
    FLAGS_TypeDef stTest; 
    int j,i; 

    stTest.bValve1_Cmd = 4; 
    stTest.bValve2_Cmd = 9; 

    for(i=1;i<=2;i++) 
    { 
    j=Valve(1); 
    printf("%d",j); 
    } 

} 
+2

Добро пожаловать в StackOverflow! Пожалуйста, проверьте [FAQ - Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask) о том, как задавать хорошие вопросы, чтобы вы получили хорошие ответы. Запросы типа «Необходимость быстрого ответа» обычно приводят к быстрому закрытию вопроса. Кроме того, у вопроса отсутствует некоторая информация, чтобы получить хороший ответ, особенно то, что сообщение об ошибке. –

+0

Я получаю сообщение об ошибке C2039: 'bValvei_Cmd': не является членом 'OperationFlags' –

ответ

0

Macro замена делается хорошо до того времени выполнения, поэтому вы не можете использовать переменную X, содержащую значение 2 для получения stTest.bValve2_Cmd. Вместо этого вы получите stTest.bValveX_Cmd, для которого не существует символа.

Вам придется найти другой способ сделать это, например, имея массив значений, для которых вы можете использовать X для выбора:

#define Valve(x) stTest.bValveX_Cmd[x] 

typedef struct OperationFlags { 
    int bValveX_Cmd[2]; 
} FLAGS_TypeDef; 
2

Это нормально! Препроцессор («вещь», обрабатывающая макросы) запускается перед компилятором C. Таким образом, он действителен только тогда, когда он создает компилируемый код.

В вашем случае, если вы используете код, который вы показать

j=Valve(1) 

он будет работать для этого значения, так как она будет производить:

j=stTest.bValve1_Cmd 

, но он будет делать весь цикл только с это значение. При изменении параметра «1» с «я» на самом деле делает петлю, то он будет производить:

j=stTest.bValvei_Cmd 

который является недействительным.

Чтобы сделать то, что вы хотите, просто использовать вектор:

typedef struct OperationFlags 
{ 
int bValve_Cmd[2]; 
}FLAGS_TypeDef; 
#define Valve(x) stTest.bValve_Cmd[x] 
//.... 
for(i=1;i<=2;i++) 
{ 
j=Valve(1); 
printf("%d",j); 
} 
+0

есть ли какой-либо другой способ, чем использовать массив, потому что я хочу уменьшить размер моего кода. поэтому мне нужны мои флаги в битном формате i.e int bValve_Cmd: 1; –

0

попробовать этот #define Valve(x) (x == 1 ? stTest.bValve1_Cmd : stTest.bValve2_Cmd)


#define Valve(x) (*(&stTest.bValve1_Cmd + (x-1)))

Примечание: Это может не сработать, если изменения окружающей среды. Также он не может использоваться в поле бит.

проверка добавить

#define Valve(x) (*(&stTest.bValve1_Cmd + (x-1))); \ 
assert(offsetof(FLAGS_TypeDef, bValve2_Cmd) == sizeof(int)) 
+0

Это будет прекрасно работать, я опубликовал только образец части всего моего кода. Существует более двух флагов, таких как bValve_Cmd. Существует около 4-5 таких флагов, которые я использую в своем коде.please предложите мне лучший способ –

+0

@sagarpadwal You может гнездиться, конечно. – BLUEPIXY

Смежные вопросы