|
CPP enum с минусовыми значениями, насколько это правильно |
|
|
|
May 25 2017, 06:25
|
Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 25 2017, 06:35
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(novikovfb @ May 25 2017, 09:32)  Почему бы и нет. Одно не понятно: чем запись minus_4 лучше простой константы -4? Логичнее было бы вместо minus_4 указать наименование типа ошибки. Константы надо "изобретать" вручную, а меня это утомляет  Кроме того с символическими именами которые предоставляет enum работать в миллион раз удобнее чем с цифровыми кодами. ps - пардон, я может неверно сформулировал в примере кода. там minus_4 приведено для наглядности. в реале - ест-но - там симв. имя ошибки вроде eErr_ADC_Ready
Сообщение отредактировал k155la3 - May 25 2017, 06:37
|
|
|
|
|
May 25 2017, 08:00
|
Частый гость
 
Группа: Участник
Сообщений: 176
Регистрация: 29-03-10
Пользователь №: 56 269

|
Постоянно применяю, только не enum, а int. Обычная практика, если функция возвращает отрицательное значение, это тип ошибки, если ноль или положительное значение, то все Ок или результат. С enum не пробовал, а зачем, int можно преобразовать или интерпретировать практически любым типом, как целое, символ или логическое значение. Удобно во вложенных функциях, возвращает тип ошибки на самый верх.
|
|
|
|
|
May 25 2017, 08:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(AnatolyT @ May 25 2017, 11:00)  . . . . Удобно во вложенных функциях, возвращает тип ошибки на самый верх. Ok. Я при "транизитном" возврате по ошибке, при каждом выходе "вверх", код ошибки умножаю на 10 - тогда видно с какого уровня "всплыло". Более правильно наверно, использовать исключения, но пока делаю так.
|
|
|
|
|
May 25 2017, 09:46
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 25 2017, 10:35
|
Профессионал
    
Группа: Свой
Сообщений: 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 приоритет ставят по разному.
|
|
|
|
|
May 25 2017, 12:27
|
Местный
  
Группа: Участник
Сообщений: 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)  Отрицательные значения - это один из вариантов этого. ну вариант не структуры, просто отрицательные числа используются. и на моей практике - как индикатор ошибки.
|
|
|
|
|
May 25 2017, 12:47
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 25 2017, 20:47
|
Гуру
     
Группа: Свой
Сообщений: 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 такой способ оптимальнее.  Кто знает асм - поймёт. Цитата(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-битное значение, то будет куча лишних команд при упаковке и потом - при распаковке. А в вышеприведённом случае - минимум команд.
|
|
|
|
|
May 26 2017, 07:25
|
Профессионал
    
Группа: Свой
Сообщений: 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 (сделанный копипастом)  на вход компилятора попадет: Код + (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. В литературе как-то не натыкался на это. А проводить гугл-сеанс нет времени. Тем более можно спросить у "первоисточников" на этом форуме  Цитата(jcxz @ May 25 2017, 23:47)  Список ошибок часто определяю так: . . . . Ok - спасибо за инф. Надо осмыслить.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|