Страница 1 из 1

проблема с #define

Добавлено: Пн мар 07, 2011 18:14:55
слушатель
Доброго времени суток!
Пользую CVAVR 1.25.9
симулирую в студии

есть код

#define Key1 3 //
#define Key2 4
#define Key3 5 //
#define Key4 6
#define Key5 7
#define KeyLeds 2
#define KeyPort PORTA
#define KeyPin PINA
#define KeyDdr DDRA
#define KeyMask ((1<<Key5)|(1<<Key4)|(1<<Key3)|(1<<Key2)|(1<<Key1))

void KeyInit(void) {
KeyDdr|=KeyMask; //
KeyPort|=KeyMask;
}

все прекрасно...
а вот так уже не работает

void KeyInit(void) {
KeyDdr|=KeyMask&(1<<KeyLeds); //
KeyPort|=KeyMask&(1<<KeyLeds);
KeyPort&=(~(1<<KeyLeds));
}
то есть вроде как работает, но в порты не записывает.
при чем даже варнинги не выскакивают...

Может я не правильно понимаю этот дефайн
хотельсь сделать независимую функцию для клавиатуры...

Re: проблема с #define

Добавлено: Пн мар 07, 2011 19:03:04
Goodefine
слушатель писал(а): то есть вроде как работает, но в порты не записывает.
при чем даже варнинги не выскакивают...
С какой радости там "&" ? Для единицы нужно "|":

Код: Выделить всё

void KeyInit(void) {
KeyDdr|=KeyMask|(1<<KeyLeds);      
KeyPort|=KeyMask|(1<<KeyLeds);
KeyPort&=~(1<<KeyLeds);
}
И еще, не пишите никогда так:

Код: Выделить всё

#define Key3 5    //
Только так:

Код: Выделить всё

#define Key3 5    /* */ 
Подумайте почему....

Re: проблема с #define

Добавлено: Пн мар 07, 2011 20:33:00
слушатель
Что делает ф-я неважно. Там еще куча разных ф-й естькоторые используют макроопределения. У меня клавиатура на 5 кнопок , в каждой из которой стоит св.диод. В прерывании меняется направление порта и считывается значение кнопок в переменную соотвктственно макросу.
Проблема в том, что программа не инициализирует порт соответственно макроопределениям. В итоге не работает ни одна ф-я.
вроде так... :music:

Re: проблема с #define

Добавлено: Пн мар 07, 2011 21:10:55
Goodefine
Еще раз, вы разницу между своим первоначальным кодом:

Код: Выделить всё

void KeyInit(void) {
KeyDdr|=KeyMask&(1<<KeyLeds); //
KeyPort|=KeyMask&(1<<KeyLeds);
KeyPort&=(~(1<<KeyLeds));
}
и исправленным:

Код: Выделить всё

void KeyInit(void) {
KeyDdr|=KeyMask|(1<<KeyLeds);     
KeyPort|=KeyMask|(1<<KeyLeds);
KeyPort&=~(1<<KeyLeds);
}
видите?...

Re: проблема с #define

Добавлено: Пн мар 07, 2011 21:27:29
слушатель
пордон... :o не видел...
уже мозги квадратные у этого компа...
вопрос снят.

Re: проблема с #define

Добавлено: Пн мар 14, 2011 22:07:38
vovik15
а почему именно /*так*/ ?
//может я вот так хочу
что это изменит?

Re: проблема с #define

Добавлено: Пн мар 14, 2011 23:08:28
ARV
vovik15 писал(а):а почему именно /*так*/ ?
//может я вот так хочу
что это изменит?
в некоторых компиляторах препроцессор сначала делает подстановки макросов, и только затем удаляет комментарии, в некоторых - наоборот. честно говоря, я не знаю, какой вариант ПРАВИЛЬНЫЙ, а может, стандарт вообще об этом умалчивает... но комментарии в макросах /* такого вида */ и в том и в другом случае не исказят код программы, в то время как комментарии // такого вида могут привести к катастрофе для компиляторов, действующих по первому варианту. вот пример:

Код: Выделить всё

#define foo(x) (1<<x) // простой сдвиг
a = b + foo(c) / 12; 
компилятор первого варианта запустит препроцессор и получит такой код:

Код: Выделить всё

a = b + (1<<c) // простой сдвиг / 12;
на этапе удаления комментариев получится такой код:

Код: Выделить всё

a = b + (1<<c)
очевидно, это даже если и скомпилируется без ошибки, то даст совсем не тот результат, который должен был получиться.

в случае с /* таким комментарием */ проблема отсутствует

Re: проблема с #define

Добавлено: Вт мар 15, 2011 08:55:16
vovik15
все понял,спасибо вам