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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Не отрабатывает #define, глюки работы директивы define
aspID
сообщение Jan 6 2008, 10:27
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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 очень похоже, что не отрабатывает.
help.gif
Заранее спасибо и всех с наступающим Рождеством! santa2.gif


ЗЫ: до сих пор не могу победить проблему, если пишу с использованием классов и НЕ использую конструктор по умолчанию - кричит "дай!" sad.gif
Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 6 2008, 11:02
Сообщение #2


Просто Che
*****

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



А как вы определяете, что не отрабатывает?
Примеры ваши учебные, должны работать. Я у себя проверил - работает laughing.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 6 2008, 12:08
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
aspID
сообщение Jan 6 2008, 12:38
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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_

То это по-моему, за ошибку "раньше-позже" не проканывает - ряд должен "сходиться", а он "расходится" twak.gif


Цитата
Писать в стиле "#<пробелы>directive" не стоит, хоть это препроцессор и понимает.

Ага, понимает! smile.gif учту замечание на будущее
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 6 2008, 13:01
Сообщение #5


Гуру
******

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



Цитата(aspID @ Jan 6 2008, 14:38) *
Или по тому, что если прописываю эти же дефайны в опциях, то работает "как хочу"....

Я понимаю, что Вы чего-то хотите, только из приведенных кусочков лично я не могу понять что Вы "хочу". Определения F_CPU в текстах нет в принципе. Соответственно имеет место "ругань", если, конечно не подсунуть определение препроцессору в командной строке через -DF_CPU, что Вы и делаете и что, естественно, работает.

Макросы КРАЙНЕ небрежны sad.gif. Рихтуем:
Код
#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))

Только о наносекундах речь не пойдет smile.gif Надо выбирать:
Код
#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
Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 6 2008, 15:14
Сообщение #6


Просто Che
*****

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



Цитата(aspID @ Jan 6 2008, 14:38) *
Ну, хотя бы по "ругательствам"...
Или по тому, что если прописываю эти же дефайны в опциях, то работает "как хочу", а не "что это?!"
...
То это по-моему, за ошибку "раньше-позже" не проканывает - ряд должен "сходиться", а он "расходится"

Вы меня извините, но почему-то то, что говорит вам zltigo я прекрасно понимаю, а то что говорите вы, нет! laughing.gif Не могли бы вы понятней объяснить, что вы хотите получить и что у вас в результате получается.

p.s. Приведенные вами выдержки из файлов main.cpp и delay.h, расположенные друг за другом, в ИАРе не дают никаких "ругательств". А если убрать #define F_CPU, то исправно выдаются ваши warning-и
Go to the top of the page
 
+Quote Post
aspID
сообщение Jan 7 2008, 20:51
Сообщение #7


Местный
***

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



называется "почувствуй себя..." завтра(сегодня) попробую проект прицепить с работы

Цитата
Надо выбирать

Ок, учтем-с, спасибо! Правда, пока не понял глубокой разницы :-/ Прошу пока не подсказывать smile.gif

Цитата
Определения F_CPU в текстах нет в принципе.

main.cpp строки 9-11 гласят
Код
#ifndef F_CPU
  #define F_CPU 3686400UL
#endif

Или "оно" за директиву не канает уже? wacko.gif

Сообщение отредактировал aspID - Jan 7 2008, 20:55
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 7 2008, 21:22
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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

Или "оно" за директиву не канает уже? wacko.gif

Канает, но исключительно для одного файла main.cpp. Что-то мне подсказывает, что у Вас delay.h не в одном файле по #include включен.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aspID
сообщение Jan 8 2008, 03:57
Сообщение #9


Местный
***

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



Цитата
Канает, но исключительно для одного файла main.cpp.

Как для одного? Это же директива препроцессора, он ее должен обработать на начальном этапе... А до этой директивы никаких #include не обозначено...

Цитата
не в одном файле по #include включен.

А! Кажется, понял, что Вы имеете в виду. Тогда полез изучать документацию на предмет порядка обработки файлов компилятором... Я почему-то считал, что тот, в котором main() будет обработан первым unsure.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 8 2008, 07:12
Сообщение #10


Гуру
******

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



Цитата(aspID @ Jan 8 2008, 05:57) *
Я почему-то считал, что тот, в котором main() будет обработан первым unsure.gif

Хоть первым, хоть двадцать первым, хоть минус первым. Все все директивы препроцессора обрабатыватываются исключительно в пределах одного единственного текущего файла и НИКАКОГО влияния ни на какие другие файлы не оказывают.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 8 2008, 08:34
Сообщение #11


Просто 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" в другие свои локальные хедер файлы, но я обычно для наглядности вложения не делаю, а описываю в файлах с кодом все входящие хедеры в явном виде.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 8 2008, 08:38
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Николай Z
сообщение Jan 8 2008, 08:59
Сообщение #13


Местный
***

Группа: Участник*
Сообщений: 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
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 8 2008, 10:14
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Николай Z @ Jan 8 2008, 12:59) *
А я прочел и решил спросить - а в чем суть возражения?

А я прочел и понял суть так, что очень хочется подловить на противоречии biggrin.gif
Будь у Вас изначально позитивный подход, Вы бы поняли, что это возражение, а дополнение.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
aspID
сообщение Jan 8 2008, 13:33
Сообщение #15


Местный
***

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



Цитата(zltigo @ Jan 6 2008, 19:01) *
Макросы КРАЙНЕ небрежны sad.gif. Рихтуем:
Код
#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))

Только о наносекундах речь не пойдет smile.gif Надо выбирать:
Код
#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))


Пересмотрел и вышеозвученной "разительной" разницы не нашел. Разве что недостаток закрывающих скобок smile.gif Я сдаюсь sad.gif разъясните, пожалуйста, почему надо сначала делить, а потом умножать.

Цитата
ключевое словосочетание

понЯл, отстал. Спасибо rolleyes.gif
Go to the top of the page
 
+Quote Post

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

 


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


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