Страница 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);
}
И еще, не пишите никогда так:
Только так:
Подумайте почему....
Re: проблема с #define
Добавлено: Пн мар 07, 2011 20:33:00
слушатель
Что делает ф-я неважно. Там еще куча разных ф-й естькоторые используют макроопределения. У меня клавиатура на 5 кнопок , в каждой из которой стоит св.диод. В прерывании меняется направление порта и считывается значение кнопок в переменную соотвктственно макросу.
Проблема в том, что программа не инициализирует порт соответственно макроопределениям. В итоге не работает ни одна ф-я.
вроде так...

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
слушатель
пордон...

не видел...
уже мозги квадратные у этого компа...
вопрос снят.
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;
компилятор первого варианта запустит препроцессор и получит такой код:
на этапе удаления комментариев получится такой код:
очевидно, это даже если и скомпилируется без ошибки, то даст совсем не тот результат, который должен был получиться.
в случае с /* таким комментарием */ проблема отсутствует
Re: проблема с #define
Добавлено: Вт мар 15, 2011 08:55:16
vovik15
все понял,спасибо вам