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

 
 
 
Reply to this topicStart new topic
> Целочисленные переменные в препроцессоре?
ArtemKAD
сообщение Jul 31 2013, 16:45
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Собственно сабж. Есть ли возможность в препроцессоре завести переменную которая будет меняться на этапе работы препроцессора? По сути достаточно простого инкремента для автоматической иннициализации некоторых ячеек массива.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 31 2013, 18:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Нет. И яр тут ни при чём. Препроцессор у него вполне себе стандартный для языка Си.
Вы лучше подробнее опишите задачу. Может быть, что-то конструктивное удастся посоветовать.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jul 31 2013, 19:29
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



можно использовать
__LINE__
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jul 31 2013, 19:48
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Можно пользоваться и пре-препроцессором. sm.gif
COG в частности
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 1 2013, 05:20
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Можешь поиграться с boost/preprocessor

Код
#define X() 4

#define BOOST_PP_VALUE 1 + 2 + 3 + X()
#include BOOST_PP_ASSIGN_SLOT(1)

#undef X

BOOST_PP_SLOT(1) // expands to 10



Код
BOOST_PP_COUNTER // 0

#include BOOST_PP_UPDATE_COUNTER()

BOOST_PP_COUNTER // 1

#include BOOST_PP_UPDATE_COUNTER()

BOOST_PP_COUNTER // 2

#include BOOST_PP_UPDATE_COUNTER()

BOOST_PP_COUNTER // 3
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Aug 1 2013, 19:32
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата(KRS @ Jul 31 2013, 22:29) *
можно использовать
__LINE__

Попробовал. Даже вроде примерно то что надо...
Вот только IAR-отладчик начал вываливаться при запуске с фатальной ошибкой sad.gif ...

Цитата(scifi @ Jul 31 2013, 21:05) *
Вы лучше подробнее опишите задачу. Может быть, что-то конструктивное удастся посоветовать.

Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

Цитата(Непомнящий Евгений @ Aug 1 2013, 08:20) *
Можешь поиграться с boost/preprocessor

Чесно говоря не сильно понял как работает. Но насколько понял это дополнение для ++ . В чистом IAR Си оно заработает?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 2 2013, 05:20
Сообщение #7


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

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



Цитата(ArtemKAD @ Aug 1 2013, 22:32) *
Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

Для этого есть enum


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 2 2013, 05:20
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(ArtemKAD @ Aug 1 2013, 23:32) *
Чесно говоря не сильно понял как работает. Но насколько понял это дополнение для ++ . В чистом IAR Си оно заработает?

буст - это сборная солянка с++ библиотек. Конкретно boost/preprocessor - это библиотека для препроцессора, в иар си работает.


Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 2 2013, 06:21
Сообщение #9


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (ArtemKAD @ Aug 2 2013, 02:32) *
Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

Можно воспользоваться свойством статических переменных. Написать функцию:
CODE
int num()
{
    static int N;
    return ++N;
}

И задавать в каждой инициализации вызов функции вместо указания значения вручную. Гарантировано будут выдаваться разные значения. Для оптимизации можно функцию определить прямо в c/cpp файле как static, тогда компилятор вообще получит возможность заменить вызовы на подстановку значений (зависит от интеллекта компилятора и степени оптимизации).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 2 2013, 09:41
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ArtemKAD @ Aug 1 2013, 23:32) *
Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

Для этого достаточно иметь механизм автоматической проверки на дублирование. Например, в код инициализации задачи вставить проверку индекса на совпадение со списком уже инициализированных задач. Этот код завернуть в #ifndef NDEBUG ... #endif, чтобы в сборках типа Release этот код не генерился.
Код
void task_init(int id)
{
#ifndef NDEBUG
    static long mask;
    assert(0 <= id && id < 8 * sizeof(mask));
    assert((mask & (1 << id)) == 0);
    mask |= (1 << id);
#endif
}
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 2 2013, 10:32
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ArtemKAD @ Aug 1 2013, 22:32) *
Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

А Вы подробнее распишите, что за диспетчер, каков механизм запуска, находятся ли задачи исключительно в одном файле итд.
Если есть отдельно процедура запуска задачи, а не статически компилированные структуры, то подобные вопросы решаются прекрасно и с __LINE__ и с функцией num()
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Aug 2 2013, 14:58
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата(dxp @ Aug 2 2013, 09:21) *
Можно воспользоваться свойством статических переменных.

Переменные не подходят. Нужны именно константы. Т.е. индексы должны формироваться на этапе компиляции, а не уже при работе.

Цитата(MrYuran @ Aug 2 2013, 08:20) *
Для этого есть enum

Да, в этом что-то есть. Если получится автоматом сформировать enum, а потом его использовать в качестве индекса массивов - может оказаться наилучшим вариантом.

PS. Да, большое спасибо. Вариант с enum очень даже хорошо получился. Сильно упростил реализацию и избавил от С99 зависимости которая слегка напрягала.
Go to the top of the page
 
+Quote Post

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

 


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


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