реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как узнать размер перечисления в C?
ViKo
сообщение May 21 2013, 12:54
Сообщение #1


Универсальный солдатик
******

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



Допустим есть
Код
typedef enum {uno, dos, tres, quatro} NUMEROS_t;

Как узнать количество элементов в перечислении, чтобы использовать в программе? В частности, чтобы декрементировать-инкрементировать переменную этого типа.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 21 2013, 12:58
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ViKo @ May 21 2013, 16:54) *
Как узнать количество элементов в перечислении, чтобы использовать в программе? В частности, чтобы декрементировать-инкрементировать переменную этого типа.

Последним пунктом объявить что-то типа NUM_OF_ELEMENTS
Тогда при условии счета с нуля оно как раз и будет равно.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 21 2013, 13:06
Сообщение #3


Универсальный солдатик
******

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



Да, всё оказалось просто - сравнить с последним элементом перечисления.
А первый - ноль, но можно сравнивать и с конкретным именем, для симметрии. sm.gif
Спасибо!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 21 2013, 13:25
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



CODE
typedef enum {uno, dos, tres, quatro, pre-last=99, last=100} NUMEROS_t;
Что именно в этом перечислении вы хотели бы узнать? wink.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
V.K
сообщение May 21 2013, 13:33
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 6-05-06
Из: РФ
Пользователь №: 16 841



Перечисление, не переменная и не массив. Это разновидность #define.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 21 2013, 13:42
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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;
Что именно в этом перечислении вы хотели бы узнать? wink.gif

Спасибо за иронию, Сергей Борщ. Когда я использую перечисления, подобные вашему (например, так я описываю альтернативные функции для STM32), я не скачу по ним инкрементом-декрементом. А для других применений, где набор сплошной и без повторов, мне просто нужно оставаться в пределах перечисления. Поэтому мне достаточно знать численные значения первого и последнего элементов.
Go to the top of the page
 
+Quote Post
DASM
сообщение May 21 2013, 14:04
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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" я так и подумал что ноги оттуда растут - совершенно мерзкий стиль, макросы многократной вложенности чтобы дернуть ногой. Перебрали они явно
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 21 2013, 14:14
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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" я так и подумал что ноги оттуда растут - совершенно мерзкий стиль, макросы многократной вложенности чтобы дернуть ногой. Перебрали они явно

Не, ноги не оттуда. sm.gif
Альтернативные функции я, действительно, задаю по-своему. От так:
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. дык, перечисление и есть набор констант
Go to the top of the page
 
+Quote Post
DASM
сообщение May 21 2013, 14:25
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Верно, но вычисление размера перечисления предложенным способом тем и плохо - вы же сами через полгода копаясь в своем коде решите добавить еще один элемент в перечисление или нечто подобное, после чего все рухнет. Ибо основано на неявном предположении о том, что все элементы инкрементируются на 1 с нуля и без пропусков.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 21 2013, 14:44
Сообщение #10


Универсальный солдатик
******

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



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

Не рухнет, потому что добавлю в середину перечисления (тем и удобно перечисление - совай внутрь, сколько влезет). А если потребуется с краю, laughing.gif тогда пройдусь по коду поиском. Предположение явно видно, в этих перечислениях я явно числа не задаю. sm.gif
P.S. Можно и не с нуля, тогда и начало проверять - по имени. Главное - чтобы значения не прерывались и не накладывались.
Go to the top of the page
 
+Quote Post
Mahagam
сообщение May 22 2013, 06:34
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 2-07-04
Из: Minsk
Пользователь №: 240



меня подобное тоже интересовало. и тоже хотелось чтобы добавив последний элемент не пришлось искать его по коду поиском и заменой. пока что обхожусь специальным терминирующим символом. (а-ля last_NUMEROS)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 22 2013, 06:53
Сообщение #12


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Привет!
Дежавюшка
Ессно, никто на едином мнении не сошелся, потому что перечисление не есть множество, число эл-тов которого ТС очень хочет знать sm.gif
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 22 2013, 08:31
Сообщение #13


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(_Pasha @ May 22 2013, 10:53) *
Привет!
Дежавюшка

А я люблю на группы по 5-10 делить пустыми строками.
Опять не катит sm.gif
Есть, правда, альтернатива - отступами играть туда-сюда вместо пропусков строк


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016