Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Целочисленные переменные в препроцессоре?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
ArtemKAD
Собственно сабж. Есть ли возможность в препроцессоре завести переменную которая будет меняться на этапе работы препроцессора? По сути достаточно простого инкремента для автоматической иннициализации некоторых ячеек массива.
scifi
Нет. И яр тут ни при чём. Препроцессор у него вполне себе стандартный для языка Си.
Вы лучше подробнее опишите задачу. Может быть, что-то конструктивное удастся посоветовать.
KRS
можно использовать
__LINE__
_Pasha
Можно пользоваться и пре-препроцессором. sm.gif
COG в частности
Непомнящий Евгений
Можешь поиграться с 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
ArtemKAD
Цитата(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 Си оно заработает?
MrYuran
Цитата(ArtemKAD @ Aug 1 2013, 22:32) *
Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

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

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


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

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

И задавать в каждой инициализации вызов функции вместо указания значения вручную. Гарантировано будут выдаваться разные значения. Для оптимизации можно функцию определить прямо в c/cpp файле как static, тогда компилятор вообще получит возможность заменить вызовы на подстановку значений (зависит от интеллекта компилятора и степени оптимизации).
scifi
Цитата(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
}
_Pasha
Цитата(ArtemKAD @ Aug 1 2013, 22:32) *
Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

А Вы подробнее распишите, что за диспетчер, каков механизм запуска, находятся ли задачи исключительно в одном файле итд.
Если есть отдельно процедура запуска задачи, а не статически компилированные структуры, то подобные вопросы решаются прекрасно и с __LINE__ и с функцией num()
ArtemKAD
Цитата(dxp @ Aug 2 2013, 09:21) *
Можно воспользоваться свойством статических переменных.

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

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

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

PS. Да, большое спасибо. Вариант с enum очень даже хорошо получился. Сильно упростил реализацию и избавил от С99 зависимости которая слегка напрягала.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.