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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> CPP enum с минусовыми значениями, насколько это правильно
k155la3
сообщение May 25 2017, 06:25
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Вопрос касается кода возврата функции, а именно удачно или нет она отработала.
Если плюс - удачно, информация в коде возврата - справочная.
Если минус - критичная ошибка, ф-ия не отработала.

(?) Насколько такой подход (с отрицательным enum) правильный-феншуйный-политкорректный ?

ps - minus_4 итд приведено для наглядности, в реале - ест-но - там симв. имя ошибки вроде eErr_ADC_Ready

А реализовал так:
Код
enum TEnum
{
    minus_4 = -4,
    minus_3,
    minus_2,
    minus_1,
    null_0 = 0,
    plus_1,
    plus_2,
    plus_3,
    plus_4
} my_enum;

. . .

int MyFun(void) {    ... ... ...   return(minus_2); ..... .... return(plus_3); }

. . .

RetCode = MyFun();

if( RetCode > 0 )
{
   . . . .  ошибок нет, в RetCode в инф. о статусе выполнения.
}
else  // минусы и 0
{
   . . . .  разбор ошибок
}


Сообщение отредактировал k155la3 - May 25 2017, 07:20
Go to the top of the page
 
+Quote Post
novikovfb
сообщение May 25 2017, 06:32
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Почему бы и нет. Одно не понятно: чем запись minus_4 лучше простой константы -4? Логичнее было бы вместо minus_4 указать наименование типа ошибки.
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 25 2017, 06:35
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(novikovfb @ May 25 2017, 09:32) *
Почему бы и нет. Одно не понятно: чем запись minus_4 лучше простой константы -4? Логичнее было бы вместо minus_4 указать наименование типа ошибки.

Константы надо "изобретать" вручную, а меня это утомляет sm.gif
Кроме того с символическими именами которые предоставляет enum работать в миллион раз удобнее чем с цифровыми кодами.

ps - пардон, я может неверно сформулировал в примере кода. там minus_4 приведено для наглядности.
в реале - ест-но - там симв. имя ошибки вроде eErr_ADC_Ready


Сообщение отредактировал k155la3 - May 25 2017, 06:37
Go to the top of the page
 
+Quote Post
_pv
сообщение May 25 2017, 07:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата
integer constant expression whose value is representable as a value of type int

Go to the top of the page
 
+Quote Post
k155la3
сообщение May 25 2017, 07:32
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



"integer constant expression whose value is representable as a value of type int"
- это в смысле что int по умолчанию signed, соответственно минус можно использовать.
Насколько я понял.

По синтаксису компилятор это, естественно, допускает.

Интересует "практика" использования отрицательных enum.
Go to the top of the page
 
+Quote Post
AnatolyT
сообщение May 25 2017, 08:00
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 29-03-10
Пользователь №: 56 269



Постоянно применяю, только не enum, а int. Обычная практика, если функция возвращает отрицательное значение, это тип ошибки, если ноль или положительное значение, то все Ок или результат. С enum не пробовал, а зачем, int можно преобразовать или интерпретировать практически любым типом, как целое, символ или логическое значение. Удобно во вложенных функциях, возвращает тип ошибки на самый верх.
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 25 2017, 08:47
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(AnatolyT @ May 25 2017, 11:00) *
. . . .
Удобно во вложенных функциях, возвращает тип ошибки на самый верх.

Ok.

Я при "транизитном" возврате по ошибке, при каждом выходе "вверх", код ошибки умножаю на 10 - тогда видно с какого уровня
"всплыло". Более правильно наверно, использовать исключения, но пока делаю так.


Go to the top of the page
 
+Quote Post
AlexRayne
сообщение May 25 2017, 09:46
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877



Цитата(k155la3 @ May 25 2017, 11:32) *
Интересует "практика" использования отрицательных enum.

нормальная практика.
более интерено енум использовать с псевдонимами и комбинациями - например объявляеш флаги:
еА = 1, еБ = 2, еВ=4. еХ=0x10
и тут же объявляеш псевдонимы комбинаций
еЧеготоОбычное = еА | еХ
eНеобычное = еБ
еОшибка = еА |еБ |еХ
тожесамое = eНеобычное | еЧеготоОбычное

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

Сообщение отредактировал AlexRayne - May 25 2017, 09:47
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 25 2017, 10:35
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(AlexRayne @ May 25 2017, 12:46) *
. . .
(1) более интерено енум использовать с псевдонимами и комбинациями - например объявляеш флаги
. . .
(2) Меня другой момент использования енумов занимает - последнее время вижу что народ константы перечисления делает большими буквами, что обычно выглядит как макро.

(1) да, допустим определены 10 констант - enum. При этом, если int 16-битный, задействовано только 4 разряда и то не полностью.
Оставшиеся 12 разрядов можно использовать для любой полезной инф - битовые флаги, поля итд. Фактически - структура.
Отрицательные значения - это один из вариантов этого.

(2) есть вроде не-дефакто-стандарты на именование различных типов. Тутуж кто-во-что горазд.
A - чтоб мне (любимому) было понятно
B - один из стандартов.
AB или BA приоритет ставят по разному.
Go to the top of the page
 
+Quote Post
AlexRayne
сообщение May 25 2017, 12:27
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877



Цитата(k155la3 @ May 25 2017, 14:35) *
(1) да, допустим определены 10 констант - enum. При этом, если int 16-битный, задействовано только 4 разряда и то не полностью.
Оставшиеся 12 разрядов можно использовать для любой полезной инф - битовые флаги, поля итд. Фактически - структура.

да, легкая альтернатива структуре.
Цитата(k155la3 @ May 25 2017, 14:35) *
Отрицательные значения - это один из вариантов этого.

ну вариант не структуры, просто отрицательные числа используются. и на моей практике - как индикатор ошибки.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 25 2017, 12:47
Сообщение #11


Гуру
******

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



QUOTE (AlexRayne @ May 25 2017, 12:46) *
Меня другой момент использования енумов занимает - последнее время вижу что народ константы перечисления делает большими буквами, что обычно выглядит как макро.
Ну по смыслу такой enum эквивалентен набору макросов
CODE
#define TAG1 VALUE1
#define TAG2    (TAG1 + 1)
#define TAG3    (TAG2 + 1)
поэтому вполне ожидаемо и аналогичное правило записи имен.


--------------------
На любой вопрос даю любой ответ
"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
x893
сообщение May 25 2017, 16:36
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



По смыслу - enum это набор неизменяемых именованных значений, по умолчанию int, но можно и другого.
А вель можно еще её сделать типом и использовать в параметрах, тогда людям понятнее что передается и что возращается.
int Foo(..);
или
ERROR_STATUS Foo(...)

А разве это не написано в книжках ?

#define можно переопределить, а enum не получится.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 25 2017, 20:47
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Список ошибок часто определяю так:
enum {ERR_1 = 1, ERR_2, ERR_3, ERR_n}; //ну или от 0
А уж возврат ошибочного значения из функции тогда или:
return ERR_...;
или:
return -ERR_...;
А если нужно возвращать из функции или данный код ошибки или корректное состояние, заданное тоже enum-ом, то делаю иногда так:
enum {OK_0, OK_1, OK_2, OK_n};
return (int)OK_1; //корректное завершение с кодом OK_1
return (int)OK_n + (int)ERR_1 - 1; //завершение с ошибкой ERR_1
Т.е. - возвращаются всегда положительные значения. Для Thumb2 такой способ оптимальнее. cool.gif Кто знает асм - поймёт.

Цитата(k155la3 @ May 25 2017, 12:35) *
Оставшиеся 12 разрядов можно использовать для любой полезной инф - битовые флаги, поля итд. Фактически - структура.

Если нужно вернуть 2 параметра, то лучше и возвращать их как 2, а не лепить из них одно в точке return, и не распаковывать потом в точке вызова.
Если мне нужно например на 32-битной архитектуре вернуть 2 значения из функции, я делаю так:
u64 FuncA() {
u64 q = (u32)val1 | (u64)(u32)val2 << 32;
return q;
}
Если пытаться всё лепить в одно 32-битное значение, то будет куча лишних команд при упаковке и потом - при распаковке. А в вышеприведённом случае - минимум команд.
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 26 2017, 07:25
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Сергей Борщ @ May 25 2017, 15:47) *
Ну по смыслу такой enum эквивалентен набору макросов
Код
#define TAG1 VALUE1
#define TAG2    (TAG1 + 1)
#define TAG3    (TAG2 + 1)
поэтому вполне ожидаемо и аналогичное правило записи имен.

По результату - да. По обработке и возможным "засадом" отличается.
enum просчитываются компилятором "за раз", а макросы - это головная боль препроцессора.
Так на какомнибуть TAG756 (сделанный копипастом) sm.gif на вход компилятора попадет:
Код
+ (TAG1)  
+ (TAG1+1) // TAG2
+ ((TAG1 + 1) + 1)  // TAG3
+ (((TAG1 + 1) + 1) + 1 ) // . . . .

... на шаге N у препроцессора (или у компилятора) срабатывает ограничение на длину строки (или списка).
(Это факт, по крайней мере для IAR/MSP430 5.40)
Причем никаких намеков ни Err, ни даже Warn компилятор не выдал.



Цитата(x893 @ May 25 2017, 19:36) *
. . . .
А разве это не написано в книжках ?

Да у меня вопрос собст-но про отрицательные enum. В литературе как-то не натыкался на это.
А проводить гугл-сеанс нет времени. Тем более можно спросить у "первоисточников" на этом форуме sm.gif


Цитата(jcxz @ May 25 2017, 23:47) *
Список ошибок часто определяю так:
. . . .

Ok - спасибо за инф. Надо осмыслить.

Go to the top of the page
 
+Quote Post
AnatolyT
сообщение May 26 2017, 09:11
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 29-03-10
Пользователь №: 56 269



Непонятно какие преимущества дает использование enum как типа возвращаемого значения функции.
Go to the top of the page
 
+Quote Post

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

 


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


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