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

 
 
 
Reply to this topicStart new topic
> Макро определения глобальных переменных в нескольких файлах, в Keil не работает со структурой
ViKo
сообщение Nov 10 2010, 10:25
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Имею макро, как описано на сайте Keil (только без подчеркиваний)
Код
#ifndef  VAR_DECLS
  #define  DECL extern
  #define  INIT(x)
#else
  #define  DECL
  #define  INIT(x) = x
#endif

В одном из файлов (Main.c), задаю VAR_DECLS, там эти переменные определяются и инициализируются. В остальных - только объявляются. Классика.
Имею тип структуры, и пытаюсь ее определить
Код
typedef struct {  
  int WorkAreaWide : 1;  // Work Area Wide
  int WorkScaleForm : 2; // Work Scale Form
  int dummy  : 6;
  } LCDMode_t  __attribute__((bitband));
DECL LCDMode_t LCDMode INIT({1, 3, 0});

На последнюю строку компилятор ругается
error: #55: too many arguments in macro invocation
Как? Как сделать, чтоб работало? У меня - никакие фокусы не проходят.

Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 10 2010, 10:36
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата
__attribute__((bitband))

Как думаете, в этом макросе двойные скобочки просто так стоят?
Надо же, я и сам только сейчас понял.
Вот ведь...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 10 2010, 12:07
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(MrYuran @ Nov 10 2010, 12:36) *
Как думаете, в этом макросе двойные скобочки просто так стоят?

И про эти двойные - не знаю зачем. Подскажите.
И на мои двойные ругается.
DECL LCDMode_t LCDMode INIT(({1, 3, 0}));
warning: #520-D: initialization with "{...}" expected for aggregate object
error: #29: expected an expression
Я ж говорю, перепробовал всякое.

Вот так работает. Только это ж не то.
DECL LCDMode_t LCDMode INIT({0});
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 10 2010, 12:11
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



А зачем такие извращения?
Нельзя просто по-человечески объявить
LCDMode_t LCDMode = {1, 3, 0};
А, понял...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 10 2010, 12:14
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(MrYuran @ Nov 10 2010, 14:11) *
А зачем такие извращения?

Чтобы не определялось снова в других файлах.
Только в одном инициализируется, а в остальных вместо INIT пустота (см. первое макро).
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 10 2010, 12:17
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Короче, в одном месте у вас запятые распознаются как разделители параметров макроса, и их, естественно получается многовато.
В другом - не хочет есть фигурные скобки внутри круглых.

Надо как-то так:

#define LCD_MODE_INIT_VALUES {1,2,3}
DECL LCDMode_t LCDMode INIT(LCD_MODE_INIT_VALUES);

Но не уверен, что прокатит


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 10 2010, 12:22
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ViKo @ Nov 10 2010, 13:25) *
Код
#define  INIT(x) = x
нехорошо так макросы писать.

По человечески будет в коде смотреться так:
Код
#define  INIT(x) x


Такое присвоение нет смысла прятать в макросе - моветон...

Вы ерундой занимаетесь.

Если не хотите кучу дублирующегося кода лицезреть то привыкайте к структурам.
в заголовочном файле:
Код
typedef struct
{
    ...
    ...
} my_struct_t;

extern my_struct_t x;

в файле реализации:
Код
my_struct_t x =
{
    ...
    ...
};


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 10 2010, 12:27
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(MrYuran @ Nov 10 2010, 14:17) *
Надо как-то так:

Получилось!
Забыл поблагодарить! Спасибо!!

Цитата(demiurg_spb @ Nov 10 2010, 14:22) *
нехорошо так макросы писать.
Такое присвоение нет смысла прятать в макросе - моветон...

Так советует Keil.
иначе как бы я запретил инициализацию в ненужном файле?
В ответ на ваше дополнение - то, что вы предложили, делается у меня автоматически, благодаря макросу. Причем сразу во всех файлах проекта. И вам советую.
Решение MrYuran меня устраивает на все 100%.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 10 2010, 12:33
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ViKo @ Nov 10 2010, 15:27) *
Так советует Keil.
На заборе тоже много дельных советов встречается:-)
Цитата
иначе как бы я запретил инициализацию в ненужном файле?
Как я привёл в примере.
Не нужно в заголовочные файлы совать определение переменных...
Не стоит бежать впереди паровоза:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 10 2010, 12:43
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Во - ссылку нашел.
http://www.keil.com/support/docs/1868.htm

Цитата(demiurg_spb @ Nov 10 2010, 14:33) *
Не нужно в заголовочные файлы совать определение переменных...

Они у меня глобальные.
На этот счет тоже можно поспорить. Но не буду. Я выбрал свой путь.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 15:29
Рейтинг@Mail.ru


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