реклама на сайте
подробности

 
 
> Директива #define, Научить считать препроцессор
andrvisht
сообщение Nov 21 2005, 08:30
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Захотелось чтобы препроцессор вычислял значение которое нужно запихнуть в UBRR...
решил сделать вот так:
Код
#define _BAUND 9600
#define Fosc 4000000
#define BAUND (Fosc/(_BAUND*16))-1

В результате получил 176 а не 25

тогда попробовал вот так:

Код
#define _BAUND 9600
#define BAUND ((Fosc/_BAUND)/16)-1

и получил желанные 25


Но ведь записи то одинаковые, а результаты разные... ???

дальше хочу определить ошибку вот таким вариантом
Код
#define _UBRR ((Fosc/(BAUND+1))/16)
#define BAUND_ERROR ((_UBRR - _BAUND)/_BAUND)*1000

результат который хотелось видеть 1 (т.е. 0.1%) а получил 0 sad.gif

И хотелось бы выводить само значение ошибки, нашел директиву

Код
#warning любое текстовое сообщение


но оно не позволяет выводить результат расчета
типа
Код
#warning ошибка установки скорости обмена составляет BAUND_ERROR


Вообщем вопрос - как обрабатывается препроцессор и можно ли выводить на экран результат в численном виде ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vet
сообщение Nov 21 2005, 08:41
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Препроцессор не умеет считать, его функция - развернуть все определённые в программе #define-ы, включить все #include-ы и т.п. Собственно обсуждаемая константа формируется компилятором, и то, что полученное значение неверно, значит, что #include составлен неправильно.
В первом случае BAUND присваивался char-у или int-у, и компилятор привёл константы к соотв. типу, результат, конечно, получился не тот, что нужно. Правильно было бы указать тип констант явно:

Код
#define _BAUND 9600L
#define Fosc 4000000L
#define BAUND ( (Fosc/(_BAUND*16L))-1L )


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

Код
#define N 2*2 /* 4/N разворачивается в 4/2*2, т.е. 4, а не 1, как задумывалось */


Чтобы этого избежать, макросы обычно заключаются в скобки:
Код
#define N (2*2) /* 4/N разворачивается в 4/(2*2) */


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- &-rey   Директива #define   Nov 21 2005, 08:30
- - starter48   Цитата(&-rey @ Nov 21 2005, 14:3...   Nov 21 2005, 08:53
- - &-rey   Спасибо, помогло. #define _BAUND 9600 #define Fosc...   Nov 21 2005, 09:37
|- - starter48   Цитата(&-rey @ Nov 21 2005, 15:3...   Nov 21 2005, 11:03
- - KRS   Вообще грамотнее использовать округление! #def...   Nov 21 2005, 09:52
|- - starter48   Цитата(KRS @ Nov 21 2005, 15:52) Вообще г...   Nov 21 2005, 11:23
|- - KRS   Цитата(starter48 @ Nov 21 2005, 14:23) Ци...   Nov 21 2005, 11:57
|- - starter48   Цитата(KRS @ Nov 21 2005, 17:57) нет имен...   Nov 21 2005, 12:34
- - &-rey   Ясно. Спасибо всем откликнувшимся... ))   Nov 21 2005, 10:01
- - &-rey   Код#define _BAUD 38400 #define _U2X 2 // Doble Spe...   Nov 24 2005, 07:25
|- - starter48   Цитата(&-rey @ Nov 24 2005, 13:2...   Nov 24 2005, 09:32
|- - &-rey   Цитата(starter48 @ Nov 24 2005, 13:32) У ...   Nov 24 2005, 10:13
|- - starter48   Цитата(&-rey @ Nov 24 2005, 16:1...   Nov 24 2005, 10:36
|- - &-rey   Цитата(starter48 @ Nov 24 2005, 14:36) По...   Nov 24 2005, 11:23
|- - starter48   Цитата(&-rey @ Nov 24 2005, 17:2...   Nov 24 2005, 11:56
|- - &-rey   AVR_Bit7=AVR_Bit2=1 пробовал, но оно разделяет код...   Nov 24 2005, 12:09
|- - starter48   Цитата(&-rey @ Nov 24 2005, 18:0...   Nov 24 2005, 12:21
|- - &-rey   Цитата(starter48 @ Nov 24 2005, 16:21) Ес...   Nov 24 2005, 12:37
- - Rash   ЦитатаВозможно ли обратиться к структуре чтобы раз...   Nov 24 2005, 10:21


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 19:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016