Перейти к содержанию
    

Как узнать размер перечисления в C?

Допустим есть

typedef enum {uno, dos, tres, quatro} NUMEROS_t;

Как узнать количество элементов в перечислении, чтобы использовать в программе? В частности, чтобы декрементировать-инкрементировать переменную этого типа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как узнать количество элементов в перечислении, чтобы использовать в программе? В частности, чтобы декрементировать-инкрементировать переменную этого типа.

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

Тогда при условии счета с нуля оно как раз и будет равно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, всё оказалось просто - сравнить с последним элементом перечисления.

А первый - ноль, но можно сравнивать и с конкретным именем, для симметрии. :)

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

typedef enum {uno, dos, tres, quatro, pre-last=99, last=100} NUMEROS_t;

Что именно в этом перечислении вы хотели бы узнать? ;)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

typedef enum {uno, dos, tres, quatro, pre-last=99, last=100} NUMEROS_t;

Что именно в этом перечислении вы хотели бы узнать? ;)

Спасибо за иронию, Сергей Борщ. Когда я использую перечисления, подобные вашему (например, так я описываю альтернативные функции для STM32), я не скачу по ним инкрементом-декрементом. А для других применений, где набор сплошной и без повторов, мне просто нужно оставаться в пределах перечисления. Поэтому мне достаточно знать численные значения первого и последнего элементов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за иронию, Сергей Борщ. Когда я использую перечисления, подобные вашему (например, так я описываю альтернативные функции для STM32), я не скачу по ним инкрементом-декрементом. А для других применений, где набор сплошной и без повторов, мне просто нужно оставаться в пределах перечисления. Поэтому мне достаточно знать численные значения первого и последнего элементов.

Для таких "использований" enum (читай - подверженных ошибкам самого разного рода) enum не нужен вообще, лучше уж define , а еще лучще набор

const int uno = 0, dos = 1, tres = 2, quatro = 3 использовать

" альтернативные функции для STM32" я так и подумал что ноги оттуда растут - совершенно мерзкий стиль, макросы многократной вложенности чтобы дернуть ногой. Перебрали они явно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для таких "использований" enum (читай - подверженных ошибкам самого разного рода) enum не нужен вообще, лучше уж define , а еще лучще набор

const int uno = 0, dos = 1, tres = 2, quatro = 3 использовать

" альтернативные функции для STM32" я так и подумал что ноги оттуда растут - совершенно мерзкий стиль, макросы многократной вложенности чтобы дернуть ногой. Перебрали они явно

Не, ноги не оттуда. :)

Альтернативные функции я, действительно, задаю по-своему. От так:

//! 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. дык, перечисление и есть набор констант

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Верно, но вычисление размера перечисления предложенным способом тем и плохо - вы же сами через полгода копаясь в своем коде решите добавить еще один элемент в перечисление или нечто подобное, после чего все рухнет. Ибо основано на неявном предположении о том, что все элементы инкрементируются на 1 с нуля и без пропусков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Верно, но вычисление размера перечисления предложенным способом тем и плохо - вы же сами через полгода копаясь в своем коде решите добавить еще один элемент в перечисление или нечто подобное, после чего все рухнет. Ибо основано на неявном предположении о том, что все элементы инкрементируются на 1 с нуля и без пропусков.

Не рухнет, потому что добавлю в середину перечисления (тем и удобно перечисление - совай внутрь, сколько влезет). А если потребуется с краю, :laughing: тогда пройдусь по коду поиском. Предположение явно видно, в этих перечислениях я явно числа не задаю. :)

P.S. Можно и не с нуля, тогда и начало проверять - по имени. Главное - чтобы значения не прерывались и не накладывались.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

меня подобное тоже интересовало. и тоже хотелось чтобы добавив последний элемент не пришлось искать его по коду поиском и заменой. пока что обхожусь специальным терминирующим символом. (а-ля last_NUMEROS)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет!

Дежавюшка

Ессно, никто на едином мнении не сошелся, потому что перечисление не есть множество, число эл-тов которого ТС очень хочет знать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет!

Дежавюшка

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

Опять не катит :)

Есть, правда, альтернатива - отступами играть туда-сюда вместо пропусков строк

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...