|
|
  |
Как узнать размер перечисления в C? |
|
|
|
May 21 2013, 13:42
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(Сергей Борщ @ May 21 2013, 16:25)  Код typedef enum {uno, dos, tres, quatro, pre-last=99, last=100} NUMEROS_t; Что именно в этом перечислении вы хотели бы узнать?  Спасибо за иронию, Сергей Борщ. Когда я использую перечисления, подобные вашему (например, так я описываю альтернативные функции для STM32), я не скачу по ним инкрементом-декрементом. А для других применений, где набор сплошной и без повторов, мне просто нужно оставаться в пределах перечисления. Поэтому мне достаточно знать численные значения первого и последнего элементов.
|
|
|
|
|
May 21 2013, 14:04
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Цитата(ViKo @ May 21 2013, 17:42)  Спасибо за иронию, Сергей Борщ. Когда я использую перечисления, подобные вашему (например, так я описываю альтернативные функции для STM32), я не скачу по ним инкрементом-декрементом. А для других применений, где набор сплошной и без повторов, мне просто нужно оставаться в пределах перечисления. Поэтому мне достаточно знать численные значения первого и последнего элементов. Для таких "использований" enum (читай - подверженных ошибкам самого разного рода) enum не нужен вообще, лучше уж define , а еще лучще набор const int uno = 0, dos = 1, tres = 2, quatro = 3 использовать " альтернативные функции для STM32" я так и подумал что ноги оттуда растут - совершенно мерзкий стиль, макросы многократной вложенности чтобы дернуть ногой. Перебрали они явно
|
|
|
|
|
May 21 2013, 14:14
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(DASM @ May 21 2013, 17:04)  Для таких "использований" enum (читай - подверженных ошибкам самого разного рода) enum не нужен вообще, лучше уж define , а еще лучще набор const int uno = 0, dos = 1, tres = 2, quatro = 3 использовать " альтернативные функции для STM32" я так и подумал что ноги оттуда растут - совершенно мерзкий стиль, макросы многократной вложенности чтобы дернуть ногой. Перебрали они явно Не, ноги не оттуда.  Альтернативные функции я, действительно, задаю по-своему. От так: CODE //! GPIO Alternate Functions typedef enum { AF_SYSTEM, //!< AF0 - SYSTEM* AF_TIM1, //!< AF1 - TIM1/2 AF_TIM2 = 1, //!< AF1 - TIM1/2 AF_TIM3, //!< AF2 - TIM3/4/5 AF_TIM4 = 2, //!< AF2 - TIM3/4/5 AF_TIM5 = 2, //!< AF2 - TIM3/4/5 AF_TIM8, //!< AF3 - TIM9/10/11 AF_TIM9 = 3, //!< AF3 - TIM9/10/11 AF_TIM10 = 3, //!< AF3 - TIM9/10/11 AF_TIM11 = 3, //!< AF3 - TIM9/10/11 AF_I2C1, //!< AF4 - I2C1/2/3 AF_I2C2 = 4, //!< AF4 - I2C1/2/3 AF_I2C3 = 4, //!< AF4 - I2C1/2/3 AF_SPI1, //!< AF5 - SPI1/2 AF_SPI2 = 5, //!< AF5 - SPI1/2 AF_SPI3, //!< AF6 - SPI3 AF_USART1, //!< AF7 - USART1/2/3 AF_USART2 = 7, //!< AF7 - USART1/2/3 AF_USART3 = 7, //!< AF7 - USART1/2/3 AF_USART4, //!< AF8 - USART4/5/6 AF_USART5 = 8, //!< AF8 - USART4/5/6 AF_USART6 = 8, //!< AF8 - USART4/5/6 AF_CAN1, //!< AF9 - CAN1/2 AF_CAN2 = 9, //!< AF9 - CAN1/2 AF_TIM12 = 9, //!< AF9 - TIM12/13/14 AF_TIM13 = 9, //!< AF9 - TIM12/13/14 AF_TIM14 = 9, //!< AF9 - TIM12/13/14 AF_OTGFS, //!< AF10 - OTGFS AF_OTGHS = 10, //!< AF10 - OTGHS AF_ETH, //!< AF11 - ETH AF_FSMC, //!< AF12 - FSMC AF_SDIO = 12, //!< AF12 - SDIO AF_OTGHS_ = 12, //!< AF12 - OTGHS AF_DCMI, //!< AF13 - DCMI AF_AF14, //!< AF14 - RI AF_EVENT //!< AF15 - SYSTEM (EVENTOUT) } GPIO_AFLH_t;
В данной же теме я просто по крутелке-энкодеру переключаю нужные мне режимы работы прибора, в описанных в перечислении пределах. Типа такого: Код int32_t par = (int32_t)MeasCtrl.Par2; par += Cnt; // параметр увеличен в 4 раза! if (par < 0) par = 0; if (par > PAR_AVR << 2) par = PAR_AVR << 2; MeasCtrl.Par2 = par; P.S. дык, перечисление и есть набор констант
|
|
|
|
|
May 21 2013, 14:44
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(DASM @ May 21 2013, 17:25)  Верно, но вычисление размера перечисления предложенным способом тем и плохо - вы же сами через полгода копаясь в своем коде решите добавить еще один элемент в перечисление или нечто подобное, после чего все рухнет. Ибо основано на неявном предположении о том, что все элементы инкрементируются на 1 с нуля и без пропусков. Не рухнет, потому что добавлю в середину перечисления (тем и удобно перечисление - совай внутрь, сколько влезет). А если потребуется с краю,  тогда пройдусь по коду поиском. Предположение явно видно, в этих перечислениях я явно числа не задаю.  P.S. Можно и не с нуля, тогда и начало проверять - по имени. Главное - чтобы значения не прерывались и не накладывались.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|