|
Не отрабатывает #define, глюки работы директивы define |
|
|
|
Jan 6 2008, 10:27
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Столкнулся с тем, что не отрабатывает. Приходится ставить все в опциях компилятора. Не понимаю, почему. Поиску либо разучился задавать вопросы, либо на самом деле ни у кого такой проблемы не возникало и здесь ее не обсуждали (наверное, вряд ли, но прошу сильно не сердиться и по возможности не просто отослать в поиск, а дать ссылку) Код #ifdef DEBUG //Генерация импульса синхронизации DDRD |= 1 << PD1; PORTD |= 1 << PD1; _delay_ms( 1 ); PORTD &= ~(1 << PD1); #endif //DEBUG Пока явно в опциях не поставишь DEBUG, в любом из файлов хоть заставься. Точно также не отрабатывает Код #ifndef F_CPU #define F_CPU 3686400UL #endif В используемом далее контексте ругается, что не определено F_CPU Код #ifndef F_CPU # warning "F_CPU not defined for <aspID/delay.h> using 1MHz" # warning "To define F_CPU go Proj->Opt->C/C++->Defined symbols" # define F_CPU 1000000UL #endif Но и этот # define очень похоже, что не отрабатывает. Заранее спасибо и всех с наступающим Рождеством! ЗЫ: до сих пор не могу победить проблему, если пишу с использованием классов и НЕ использую конструктор по умолчанию - кричит "дай!"
|
|
|
|
|
Jan 6 2008, 12:08
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(aspID @ Jan 6 2008, 12:27)  Столкнулся с тем, что не отрабатывает. Не работать не может. Нет, конечно, если в огороде бузина а дядька в Киеве, то тогода будут проблемы... Надо понимать, что #define F_CPU 3686400UL это не есть нечно вроде "глобальной переменной". Это просто простейшая подстановка препроцесора которая должна встретиться до ее использования именно в текущем файле или прямо описанная, или описанная в другом файле, но включенном в текуший через #include. P.S. Писать в стиле "#<пробелы>directive" не стоит, хоть это препроцессор и понимает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 6 2008, 12:38
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Цитата А как вы определяете, что не отрабатывает? Ну, хотя бы по "ругательствам"... Или по тому, что если прописываю эти же дефайны в опциях, то работает "как хочу", а не "что это?!" Если main.cpp начинается с Код #ifndef ENABLE_BIT_DEFINITIONS #define ENABLE_BIT_DEFINITIONS #endif
#ifndef DEBUG #define DEBUG #endif //DEBUG
#ifndef F_CPU #define F_CPU 3686400UL #endif
#include <iotiny2313.h> #include <aspID/defs.h> #include <aspID/delay.h> #include "1-wire.h" #include <aspID/seg7.h> А в delay.h стоит Код #ifndef _DELAY_H_ASP_ #define _DELAY_H_ASP_
#include <inavr.h>
#ifndef F_CPU # warning "F_CPU not defined for <aspID/delay.h> using 1MHz" # warning "To define F_CPU go Proj->Opt->C/C++->Defined symbols" # define F_CPU 1000000UL #endif
#define _delay_ns(x) __delay_cycles(x*F_CPU/1000000000) #define _delay_us(x) __delay_cycles(x*F_CPU/1000000) #define _delay_ms(x) __delay_cycles(x*F_CPU/1000) #define _delay_s(x) __delay_cycles(x*F_CPU)
#endif //_DELAY_H_ASP_ То это по-моему, за ошибку "раньше-позже" не проканывает - ряд должен "сходиться", а он "расходится" Цитата Писать в стиле "#<пробелы>directive" не стоит, хоть это препроцессор и понимает. Ага, понимает!  учту замечание на будущее
|
|
|
|
|
Jan 6 2008, 13:01
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(aspID @ Jan 6 2008, 14:38)  Или по тому, что если прописываю эти же дефайны в опциях, то работает "как хочу".... Я понимаю, что Вы чего-то хотите, только из приведенных кусочков лично я не могу понять что Вы "хочу". Определения F_CPU в текстах нет в принципе. Соответственно имеет место "ругань", если, конечно не подсунуть определение препроцессору в командной строке через -DF_CPU, что Вы и делаете и что, естественно, работает. Макросы КРАЙНЕ небрежны  . Рихтуем: Код #define _delay_ns(x) __delay_cycles(((x)*(F_CPU))/1000000000UL) #define _delay_us(x) __delay_cycles(((x)*(F_CPU))/1000000UL) #define _delay_ms(x) __delay_cycles(((x)*(F_CPU))/1000UL) #define _delay_s(x) __delay_cycles((x)*(F_CPU)) Только о наносекундах речь не пойдет  Надо выбирать: Код #define _delay_ns(x) __delay_cycles((x)*((F_CPU)/1000000000UL) #define _delay_us(x) __delay_cycles((x)*((F_CPU)/1000000UL) #define _delay_ms(x) __delay_cycles((x)*((F_CPU)/1000UL) #define _delay_s(x) __delay_cycles((x)*(F_CPU))
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 6 2008, 15:14
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(aspID @ Jan 6 2008, 14:38)  Ну, хотя бы по "ругательствам"... Или по тому, что если прописываю эти же дефайны в опциях, то работает "как хочу", а не "что это?!" ... То это по-моему, за ошибку "раньше-позже" не проканывает - ряд должен "сходиться", а он "расходится" Вы меня извините, но почему-то то, что говорит вам zltigo я прекрасно понимаю, а то что говорите вы, нет!  Не могли бы вы понятней объяснить, что вы хотите получить и что у вас в результате получается. p.s. Приведенные вами выдержки из файлов main.cpp и delay.h, расположенные друг за другом, в ИАРе не дают никаких "ругательств". А если убрать #define F_CPU, то исправно выдаются ваши warning-и
|
|
|
|
|
Jan 7 2008, 20:51
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
называется "почувствуй себя..." завтра(сегодня) попробую проект прицепить с работы Цитата Надо выбирать Ок, учтем-с, спасибо! Правда, пока не понял глубокой разницы :-/ Прошу пока не подсказывать  Цитата Определения F_CPU в текстах нет в принципе. main.cpp строки 9-11 гласят Код #ifndef F_CPU #define F_CPU 3686400UL #endif Или "оно" за директиву не канает уже?
Сообщение отредактировал aspID - Jan 7 2008, 20:55
|
|
|
|
|
Jan 7 2008, 21:22
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(aspID @ Jan 7 2008, 22:51)  Правда, пока не понял глубокой разницы Есть. Местами разительная. Цитата main.cpp строки 9-11 гласят Код #ifndef F_CPU #define F_CPU 3686400UL #endif Или "оно" за директиву не канает уже?  Канает, но исключительно для одного файла main.cpp. Что-то мне подсказывает, что у Вас delay.h не в одном файле по #include включен.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 8 2008, 03:57
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Цитата Канает, но исключительно для одного файла main.cpp. Как для одного? Это же директива препроцессора, он ее должен обработать на начальном этапе... А до этой директивы никаких #include не обозначено... Цитата не в одном файле по #include включен. А! Кажется, понял, что Вы имеете в виду. Тогда полез изучать документацию на предмет порядка обработки файлов компилятором... Я почему-то считал, что тот, в котором main() будет обработан первым
|
|
|
|
|
Jan 8 2008, 08:34
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Практическая рекомендация к теоретическим объяснениям zltigo: Я обычно делаю хедер файл, в котором описываю все глобальные для всего проекта define, описания регистровых флагов (если они используются), extern-ы глобальных переменных и функций, называя его, например defines.h Код //==============================================================// // Header file for ........ : External Definitions // //==============================================================// #ifndef ENABLE_BIT_DEFINITIONS #define ENABLE_BIT_DEFINITIONS #endif
#ifndef DEBUG #define DEBUG #endif //DEBUG
#ifndef F_CPU #define F_CPU 3686400UL #endif
__regvar __no_init volatile union { unsigned char Flags1; struct { unsigned char f10ms_Past :1; unsigned char :7; }; } @ 15;
extern unsigned char Test1; extern void crc16_XModem(unsigned char data); ...... Далее этот файл добавляется через #include "defines.h" ВО ВСЕ другие файлы проекта, где встречаются эти определения. Можно делать и вложенные #include "defines.h" в другие свои локальные хедер файлы, но я обычно для наглядности вложения не делаю, а описываю в файлах с кодом все входящие хедеры в явном виде.
|
|
|
|
|
Jan 8 2008, 08:38
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zltigo @ Jan 8 2008, 09:12)  в пределах одного единственного текущего файла текущего компилируемого (и включенных в него заголовочных) файла. для aspID: ключевое словосочетание для поисков в книгах и гугле - "раздельная компиляция"
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 8 2008, 08:59
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
zltigo сказал: Цитата(zltigo @ Jan 8 2008, 10:12)  Хоть первым, хоть двадцать первым, хоть минус первым. Все все директивы препроцессора обрабатыватываются исключительно в пределах одного единственного текущего файла и НИКАКОГО влияния ни на какие другие файлы не оказывают. Сергей Борщ возразил на это: Цитата(Сергей Борщ @ Jan 8 2008, 11:38)  текущего компилируемого (и включенных в него заголовочных) файла. А я прочел и решил спросить - а в чем суть возражения? По-моему zltigo и как раз и говорил о текущем файле - т.е. как раз о компилируемом?
Сообщение отредактировал Николай Z - Jan 8 2008, 09:03
|
|
|
|
|
Jan 8 2008, 13:33
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Цитата(zltigo @ Jan 6 2008, 19:01)  Макросы КРАЙНЕ небрежны  . Рихтуем: Код #define _delay_ns(x) __delay_cycles(((x)*(F_CPU))/1000000000UL) #define _delay_us(x) __delay_cycles(((x)*(F_CPU))/1000000UL) #define _delay_ms(x) __delay_cycles(((x)*(F_CPU))/1000UL) #define _delay_s(x) __delay_cycles((x)*(F_CPU)) Только о наносекундах речь не пойдет  Надо выбирать: Код #define _delay_ns(x) __delay_cycles((x)*((F_CPU)/1000000000UL) #define _delay_us(x) __delay_cycles((x)*((F_CPU)/1000000UL) #define _delay_ms(x) __delay_cycles((x)*((F_CPU)/1000UL) #define _delay_s(x) __delay_cycles((x)*(F_CPU)) Пересмотрел и вышеозвученной "разительной" разницы не нашел. Разве что недостаток закрывающих скобок  Я сдаюсь  разъясните, пожалуйста, почему надо сначала делить, а потом умножать. Цитата ключевое словосочетание понЯл, отстал. Спасибо
|
|
|
|
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|