С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Макрос, генерирующий опреденное количество переменных в структуре

31.08.2017, 18:28. Показов 2108. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток Господа. Хотел бы узнать такой момент. Можно ли с помощью макросов сгенерировать определенное количество переменных в структуре, определенного типа?
К примеру:
C++
1
2
3
4
5
6
#define MyMacros(type)
struct type
{
// Вот тут нужны например определенное количество переменных, 
// определенного типа данных. Их количество зависит от type
};
Реально ли?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.08.2017, 18:28
Ответы с готовыми решениями:

Макрос, генерирующий звук с заданными продолжительностью и тоном
Дано Параметры (2): продолжительность звука и его тон. Макрос должен генерировать звук с заданными параметрами. Помогите пожалуйста, если...

Проверка переменных в структуре
Вопрос как проверить переменные в структуре: struct blocknode { unsigned int bsize; bool free; unsigned char *bptr; ...

Непонятная перезапись переменных в структуре
Доброго времени суток, господа форумчане! На досуге столкнулся с одной любопытной проблемой, касающейся поведения char`овских переменных...

30
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.08.2017, 18:33
Оно то наверное можно, но зачем?
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
31.08.2017, 18:35  [ТС]
Avazart, ради любопытства захотел кое-что сделать
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.08.2017, 20:00
Реально

Добавлено через 59 секунд
Правда здесь получится так, что лекарство хуже болезни
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
31.08.2017, 20:14  [ТС]
Evg, Почему? Объясните пожалуйста
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
31.08.2017, 20:20
Цитата Сообщение от Bretbas Посмотреть сообщение
Почему? Объясните пожалуйста
Массивы никак с той же задачей не справятся наверное? Я так понимаю если количество единственный параметр то тип наверно у всех этих переменных одинаковый.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
31.08.2017, 20:30  [ТС]
Fulcrum_013, Да одинаковый тип, но массивом нельзя. Нужно именно переменными
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
31.08.2017, 20:40
Цитата Сообщение от Bretbas Посмотреть сообщение
но массивом нельзя
Что мешает?
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
31.08.2017, 20:42  [ТС]
Fulcrum_013,
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Что мешает?
Есть разница? Просто нельзя их использовать и все. Нужно генерировать именно переменные.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.08.2017, 20:58
Цитата Сообщение от Bretbas Посмотреть сообщение
Evg, Почему? Объясните пожалуйста
"Циклы" на препроцессоре
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
31.08.2017, 21:25  [ТС]
Evg, Тоесть, из-за того, что нет реальных циклов на препроцессоре, мою поставленную задачу нельзя решить?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.08.2017, 21:59
Лучший ответ Сообщение было отмечено Bretbas как решение

Решение

Напрямую не решить. Через подобные нанотехнологии - "решить" (в кавычках)
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
01.09.2017, 08:12  [ТС]
Evg, вообщем тогда закрыли тему
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.09.2017, 11:37
Цитата Сообщение от Bretbas Посмотреть сообщение
Можно ли с помощью макросов сгенерировать определенное количество переменных в структуре, определенного типа?
можно.
Цитата Сообщение от Bretbas Посмотреть сообщение
из-за того, что нет реальных циклов на препроцессоре, мою поставленную задачу нельзя решить?
препроцессор языка си полный по тьюрингу.
можно циклы, можно условия,
и тп.

другое дело, что результат гм... не особо читабельно-отлаживаемый.

пример SFINAE-детектора компилябельности любых выражений на языке с++:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define dCHECK_EXPRESSION_FACTORY(checkName, negative, expression, ...)  \
    template< ddeclarate_classesT(__VA_ARGS__)>                \
    class checkName                                            \
    {                                                          \
        template<pp_class_list(__VA_ARGS__)>                   \
            static decltype((expression), std::true_type{})    \
                check( pp_use_args(__VA_ARGS__) );             \
                                                               \
        template<pp_class_list(__VA_ARGS__)>                   \
            static std::false_type check(...);                 \
    public:                                                    \
        checkName(){}                                          \
        using type = decltype(                                 \
            check<dclassT(__VA_ARGS__)>(dnullptr(__VA_ARGS__)) \
        );                                                     \
        enum { value = type::value };                          \
    };                                                         \
    dSFINAE_GENERATOR(checkName, negative, __VA_ARGS__ )
попробуйте догадаться, что это вообще такое может быть

результат раскрытия макроса - SFINAE-детектор,
при помощи которого можно времени компиляции определять,
скомпилируется ли указанное выражение.

в пользовательском коде,
проверка компилябельности выражения может выглядеть так:

C++
1
2
3
4
5
6
7
8
9
10
    dCHECK_EXPRESSION(can_output, can_not_output, Ostream, Target,
        std::declval<Ostream&>() << std::declval<Target&>()
    );
...
   // true, тип int умеет выводится в поток
   std::cout << can_output<int>::value << std::endl;
 
   struct some{};
   // false, тип some не умеет выводится в поток
   std::cout << can_not_output<some>::value << std::endl;
в примере выше, макрос раскроется под пять аргументов,
последний аргумент:
C++
1
std::declval<Ostream&>() << std::declval<Target&>()
собственно и есть выражение,
которое провалидирует результирующий шаблон.

в данном примере:
мы хотим времени компиляции узнать,
можно ли объект типа Target вывести в поток типа Ostream

разные выражения могут потребовать различное количество объектов,
которое в нем участвуют.

соответственно, нужно реплецировать шаблон-валидатор
под это разное количество.

в данном случае внутри результирующего шаблона в цикле
прописываются соответствующие типы, аргументы, и тп.



как видите,
препроцессором можно практически без ограничений
обрабатывать текст любой произвольной сложности.

но блин - нефига же не читабельно.
а если придется отлаживать - проще сразу застрелиться.
1
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.09.2017, 16:07
Цитата Сообщение от Bretbas Посмотреть сообщение
Просто нельзя их использовать и все. Нужно генерировать именно переменные.
Почему нельзя? Обычно как раз лучше а не нельзя. Чем
C++
1
int a[10];
лучше чем
C++
1
int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
обычно разъясняют еще в 10-ом классе.
При этом вариант с массивом имеет все те же возможности что и набор переменных. Плюс доступ по индексу без унсафе арифметики указателей.
1
01.09.2017, 17:09

Не по теме:

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
обычно разъясняют еще в 10-ом классе.
это зависит от школы, не надо тут обобщать.

0
01.09.2017, 17:18

Не по теме:


Цитата Сообщение от GbaLog- Посмотреть сообщение
это зависит от школы, не надо тут обобщать.
Я в школе на информатику не ходил. Только на олимпиады ездил. Это я к тому что ТС-у который реально реализовал 3D танчики с AI, работающей подвеской и т.п. преимущества массива над набором несвязанных однотипных переменных должны быть давно понятны, потому и вызывает удивление сам вопрос.

0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
01.09.2017, 18:00  [ТС]
hoggy,
попробуйте догадаться, что это вообще такое может быть
Пока не могу разобраться Я просто захотел впервые почувствовать на себе, что такое макросы, и поставил перед собой задачу, которая прозвучала в моем первом вопросе темы

Fulcrum_013,
Почему нельзя? Обычно как раз лучше а не нельзя.
Да я знаю, что так можно Но просто хотел посмотреть, можно ли с помощью макросов генерировать определенное количество переменных. Поэтому и решил без массивов. С массивами конечно все просто

Fulcrum_013,

Не по теме:

Это я к тому что ТС-у который реально реализовал 3D танчики с AI, работающей подвеской и т.п. преимущества массива над набором несвязанных однотипных переменных должны быть давно понятны, потому и вызывает удивление сам вопрос.
Я покраснел:D

0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
01.09.2017, 18:04
Цитата Сообщение от Bretbas Посмотреть сообщение
С массивами конечно все просто
Если объекты, которые нужно положить в массив, не допускают инициализации по-умолчанию, можно воспользоваться Placement new (ru.wikipedia.org/wiki/New_(C%2B%2B)#Placement_new)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.09.2017, 18:40
Лучший ответ Сообщение было отмечено Bretbas как решение

Решение

Цитата Сообщение от Bretbas Посмотреть сообщение
Я просто захотел впервые почувствовать на себе, что такое макросы
макросы - зло.
если есть возможность их не использовать,
то стоит подумать: может ну их нафиг?

они используются для двух основных целей:

1.
условная компиляция
что бы на уровне исходного кода порешать проблемы платформо-специфических зависимостей,
либо применить настройки конфигурации
(допустим, в релизе мы хотим повыпиливать из сборки часть проверок)

2.
для всяческих извращений проворачивая хитроумных трюков,
значительно расширяющих возможности языка.

существует мнение, что и первое и второе - не нужно.
но мы то знаем http://www.boost.org/doc/libs/... index.html
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.09.2017, 18:40
Помогаю со студенческими работами здесь

Сбрасываются значения переменных в структуре
Доброго времени суток. Есть одна структура. struct { bool AllowInFile; bool AllowInCLI; char * FileName; }...

Может ли порядок объявления переменных в структуре влиять на ее размер?
Здравствуйте. Недавно обнаружил интересную вещь. Есть вот такой код: struct A { byte a; // short b; byte c; ...

Почему не получается освободить память, выделенную для переменных в структуре?
не получается освободить память, выделенную для переменных в структуре. Помогите пожалуйста, код ниже. #include &lt;iostream&gt; ...

Передача переменных Excel/Word в макрос
Есть переменная в C# name в не храниться предположим ИМЯ 1. Необходимо передать эту переменную в макрос Excel и Word для сохранение файла...

Нужен макрос для автоматической замены переменных в формулах
Доброго дня всем! Пожалуйста, помогите написать макрос. В прикрепленном файле Пример макрос должен найти все ячейки с формулами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru