Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752

Как выбрать один дефайн из нескольких?

29.01.2016, 11:44. Показов 3762. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В настоящий момент программа средствами условной компиляции может быть настроена на применение одного из двух кварцев 64MHz или 66MHz.
Соответствующие ветки настроены только на свой дефайн:
Code
1
2
3
4
5
6
7
#if (defined FQ_64MHz) && (! defined FQ_66MHz)
...
#endif
;
#if (defined FQ_66MHz) && (! defined FQ_64MHz)
...
#endif
Встроена защита от отсутствия обоих дефайнов:
Code
1
2
3
#if (! defined FQ_66MHz) && (! defined FQ_64MHz)
#error "Somstant FQ_64MHz or FQ_66MHz not defined."
#endif
или от применения сразу обоих:
Code
1
2
3
#if (defined FQ_64MHz) && (defined FQ_66MHz)
#error "It defines only one somstomt FQ_64MHz or FQ_66MHz."
#endif
Возникла необходимость добавить третий дефайн. Как это решается стандартно?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.01.2016, 11:44
Ответы с готовыми решениями:

Рандомно выбрать один объект из нескольких
У меня есть n объектов 1 класса. Как из них выбрать рандомный?

Выбрать данные из нескольких листов на один лист
Приветствую всех. предистория: на одном листе есть несколько диапазонов ячеек с данными по 2 колонки, причем в одной колонке данные у...

Рандомно выбрать один массив из нескольких массивов
Здравствуйте, есть массивы array1, array2, array3...arrayN, как можно выбрать рандомно один из них? Заранее благодарю:)

10
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
29.01.2016, 12:03
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifdef FQ_64MHz
...
#elif defined(FQ_66MHz)
...
#elif defined(FQ_xxMHz)
...
#elif defined(FQ_yyMHz)
...
#elif defined(FQ_nnMHz)
...
#else
#error Not supported
#endif
Защиты от отсутствия или присутствия нескольких в данном случае решаются автоматически - берется первый присутствующий.
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
29.01.2016, 12:49
Это все понятно, спасибо.
Но нет предупреждения от использования двух дефайнов одновременно. Или трех, в этом и затык...
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
29.01.2016, 13:12
Если у вас серия однотипных - замените их на
#define FQ_MHZ 66
и проверяйте через
#if FQ_MHZ == 66
- это всё упростит
(дефайны типа #FQ_66MHZ, если они уже используются, можете генерить сами под #if)
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
29.01.2016, 13:56
При определении
#define FQ_MHZ 66
я так понимаю мы сопоставили числовой константе FQ_MHZ значение 66. Те же яйца, только сбоку. А если задать 87, которые программа не умеет обрабатывать?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
29.01.2016, 14:29
Так проверки ж упрощаются до предела:
Code
1
2
3
4
5
#ifndef FQ
#error please define FQ
#elif FQ!=64 && FQ!=66 && FQ!=75
#error wrong FQ
#endif
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
29.01.2016, 15:20
Не пойдет, неизящно это
#elif FQ!=64 && FQ!=66 && FQ!=75
И сколько частот надо перечислить как поддерживаемые/неподдерживаемые?
Знаю и прорабатывал принцип выбора компилятора в инклюдах.
Мне нужна ошибка при отсутствии дефайнов, при применении более одного дефайна.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
29.01.2016, 17:57
Перечислить надо только поддерживаемые, т.е. три. И только в одной строке, где проверка (там, где используете - всего одна проверка на равенство)
Всё, что не соответствует - ошибка.
Через свойства проекта два разных значения дефайна вы задать не сможете.

Если очень охота начинать с ваших дефайнов (зачем?) - можете собрать из них мой пачкой ifdef:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifdef FQ64
#ifdef FQ
#error duplicate freq defymition
#endif
#define FQ 64
#endif
 
#ifdef FQ66
#ifdef FQ
#error duplicate freq defymition
#endif
#define FQ 66
#endif
 
...
Идею поняли? Блоки для всех частот тупо одинаковые.

Другой вариант:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifdef FQ64
#define FQ 64
#endif
#ifdef FQ66
#define FQ 66
#endif
...
 
#ifndef FQ
#error FQ not defined
#endif
 
#if defined(FQ64) && FQ!=64
#error FQ conflict
#endif
...
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
29.01.2016, 21:45
Нельзя ли привести сам принцип выбора из трех дефайнов? При отсутствии дефайнов, при применении более одного дефайна должна быть ошибка.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
29.01.2016, 22:29
omokost, так оба варианта, которые я вам привёл, делают ровно это.
Принцип простой:
В первом варианте - перебираем все _разрешённые_ частоты (макросы FQ64/FQ66/FQ75) и для каждой пробуем установить FQ. Если FQ была установлена раньше - значит, определено более одного макроса. После перебора всех надо проверить #ifndef FQ - если так, значит, не определён ни один макрос.

Во втором - два прохода по всем макросам. На первом проходе определяем FQ, на втором проверяем, нет ли конфликтов.

Впрочем, кажется, конкретно вашу задачу можно решить проще.
Code
1
2
3
4
5
6
#if defined(FQ64) + defined(FQ66) + defined(FQ75) == 0
#error FQ not defined
#endif
#if defined(FQ64) + defined(FQ66) + defined(FQ75) >1
#error multiple FQ defymitions
#endif
Или попросту
Code
1
2
3
#if defined(FQ64) + defined(FQ66) + defined(FQ75) != 1
#error FQ should be defined exactly once
#endif
Но я таки крайне советую отказаться от трёх отдельных макросов в пользу одного, показывающего частоту.
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
05.02.2016, 21:04
Спасибо oomomstir, я так и сделал (одна переменная на частоту). Правда без матюков не обошлось, оказалось есть отличия у С51 и препроцессора А51 в Keil. Немного по разному интерпретируют дефайны. Но разобрался, все работает по вашему рецепту, спасибо еще раз...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.02.2016, 21:04
Помогаю со студенческими работами здесь

Подскажите как лучше поступить(делегирование,дефайн.)
Господа... у меня есть property 'user'... который хранится в AppDelegate Я могу к нему достучаться через такую вот конструкцию ...

Как выбрать данные с нескольких таблиц?
Добрый вечер , у меня есть 5 таблиц с одинаковыми записями. Мне нужно через метод LIKE SQL проверить сразу в 5 таблицах text и title и...

Выбрать уникальные значения нескольких полей из нескольких таблиц
Добрый вечер. Каким образом можно выбрать уникальные значения нескольких полей из нескольких таблиц. Обычный group by выдает...

Как выбрать нужную касательную из нескольких возможных?
Автокад часто строит не ту касательную которая нужна, а есть ли меню выбора? Как в других чертилках? Добавлено через 24 минуты ...

Как выбрать одно из нескольких подключений к интернету?
Ситуация: у человека есть GPRS и "тарелка". Исходящий траффик через GPRS, а входящий через быструю тарелку. Я написал программку, которая...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru