artemkad 88 31 июля, 2013 Опубликовано 31 июля, 2013 · Жалоба Собственно сабж. Есть ли возможность в препроцессоре завести переменную которая будет меняться на этапе работы препроцессора? По сути достаточно простого инкремента для автоматической иннициализации некоторых ячеек массива. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 31 июля, 2013 Опубликовано 31 июля, 2013 · Жалоба Нет. И яр тут ни при чём. Препроцессор у него вполне себе стандартный для языка Си. Вы лучше подробнее опишите задачу. Может быть, что-то конструктивное удастся посоветовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 31 июля, 2013 Опубликовано 31 июля, 2013 · Жалоба можно использовать __LINE__ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 31 июля, 2013 Опубликовано 31 июля, 2013 · Жалоба Можно пользоваться и пре-препроцессором. :) COG в частности Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 1 августа, 2013 Опубликовано 1 августа, 2013 · Жалоба Можешь поиграться с 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 88 1 августа, 2013 Опубликовано 1 августа, 2013 · Жалоба можно использовать __LINE__ Попробовал. Даже вроде примерно то что надо... Вот только IAR-отладчик начал вываливаться при запуске с фатальной ошибкой :( ... Вы лучше подробнее опишите задачу. Может быть, что-то конструктивное удастся посоветовать. Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать. Можешь поиграться с boost/preprocessor Чесно говоря не сильно понял как работает. Но насколько понял это дополнение для ++ . В чистом IAR Си оно заработает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 2 августа, 2013 Опубликовано 2 августа, 2013 · Жалоба Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать. Для этого есть enum Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 2 августа, 2013 Опубликовано 2 августа, 2013 · Жалоба Чесно говоря не сильно понял как работает. Но насколько понял это дополнение для ++ . В чистом IAR Си оно заработает? буст - это сборная солянка с++ библиотек. Конкретно boost/preprocessor - это библиотека для препроцессора, в иар си работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 2 августа, 2013 Опубликовано 2 августа, 2013 · Жалоба Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать. Можно воспользоваться свойством статических переменных. Написать функцию: int num() { static int N; return ++N; } И задавать в каждой инициализации вызов функции вместо указания значения вручную. Гарантировано будут выдаваться разные значения. Для оптимизации можно функцию определить прямо в c/cpp файле как static, тогда компилятор вообще получит возможность заменить вызовы на подстановку значений (зависит от интеллекта компилятора и степени оптимизации). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 2 августа, 2013 Опубликовано 2 августа, 2013 · Жалоба Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 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 0 2 августа, 2013 Опубликовано 2 августа, 2013 · Жалоба Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать. А Вы подробнее распишите, что за диспетчер, каков механизм запуска, находятся ли задачи исключительно в одном файле итд. Если есть отдельно процедура запуска задачи, а не статически компилированные структуры, то подобные вопросы решаются прекрасно и с __LINE__ и с функцией num() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 2 августа, 2013 Опубликовано 2 августа, 2013 · Жалоба Можно воспользоваться свойством статических переменных. Переменные не подходят. Нужны именно константы. Т.е. индексы должны формироваться на этапе компиляции, а не уже при работе. Для этого есть enum Да, в этом что-то есть. Если получится автоматом сформировать enum, а потом его использовать в качестве индекса массивов - может оказаться наилучшим вариантом. PS. Да, большое спасибо. Вариант с enum очень даже хорошо получился. Сильно упростил реализацию и избавил от С99 зависимости которая слегка напрягала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться