k155la3 27 25 мая, 2017 Опубликовано 25 мая, 2017 (изменено) · Жалоба Вопрос касается кода возврата функции, а именно удачно или нет она отработала. Если плюс - удачно, информация в коде возврата - справочная. Если минус - критичная ошибка, ф-ия не отработала. (?) Насколько такой подход (с отрицательным 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 { . . . . разбор ошибок } Изменено 25 мая, 2017 пользователем k155la3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 19 25 мая, 2017 Опубликовано 25 мая, 2017 · Жалоба Почему бы и нет. Одно не понятно: чем запись minus_4 лучше простой константы -4? Логичнее было бы вместо minus_4 указать наименование типа ошибки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 25 мая, 2017 Опубликовано 25 мая, 2017 (изменено) · Жалоба Почему бы и нет. Одно не понятно: чем запись minus_4 лучше простой константы -4? Логичнее было бы вместо minus_4 указать наименование типа ошибки. Константы надо "изобретать" вручную, а меня это утомляет :) Кроме того с символическими именами которые предоставляет enum работать в миллион раз удобнее чем с цифровыми кодами. ps - пардон, я может неверно сформулировал в примере кода. там minus_4 приведено для наглядности. в реале - ест-но - там симв. имя ошибки вроде eErr_ADC_Ready Изменено 25 мая, 2017 пользователем k155la3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 77 25 мая, 2017 Опубликовано 25 мая, 2017 · Жалоба integer constant expression whose value is representable as a value of type int Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 25 мая, 2017 Опубликовано 25 мая, 2017 · Жалоба "integer constant expression whose value is representable as a value of type int" - это в смысле что int по умолчанию signed, соответственно минус можно использовать. Насколько я понял. По синтаксису компилятор это, естественно, допускает. Интересует "практика" использования отрицательных enum. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolyT 0 25 мая, 2017 Опубликовано 25 мая, 2017 · Жалоба Постоянно применяю, только не enum, а int. Обычная практика, если функция возвращает отрицательное значение, это тип ошибки, если ноль или положительное значение, то все Ок или результат. С enum не пробовал, а зачем, int можно преобразовать или интерпретировать практически любым типом, как целое, символ или логическое значение. Удобно во вложенных функциях, возвращает тип ошибки на самый верх. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 25 мая, 2017 Опубликовано 25 мая, 2017 · Жалоба . . . . Удобно во вложенных функциях, возвращает тип ошибки на самый верх. Ok. Я при "транизитном" возврате по ошибке, при каждом выходе "вверх", код ошибки умножаю на 10 - тогда видно с какого уровня "всплыло". Более правильно наверно, использовать исключения, но пока делаю так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexRayne 7 25 мая, 2017 Опубликовано 25 мая, 2017 (изменено) · Жалоба Интересует "практика" использования отрицательных enum. нормальная практика. более интерено енум использовать с псевдонимами и комбинациями - например объявляеш флаги: еА = 1, еБ = 2, еВ=4. еХ=0x10 и тут же объявляеш псевдонимы комбинаций еЧеготоОбычное = еА | еХ eНеобычное = еБ еОшибка = еА |еБ |еХ тожесамое = eНеобычное | еЧеготоОбычное Меня другой момент использования енумов занимает - последнее время вижу что народ константы перечисления делает большими буквами, что обычно выглядит как макро. Изменено 25 мая, 2017 пользователем AlexRayne Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 25 мая, 2017 Опубликовано 25 мая, 2017 · Жалоба . . . (1) более интерено енум использовать с псевдонимами и комбинациями - например объявляеш флаги . . . (2) Меня другой момент использования енумов занимает - последнее время вижу что народ константы перечисления делает большими буквами, что обычно выглядит как макро. (1) да, допустим определены 10 констант - enum. При этом, если int 16-битный, задействовано только 4 разряда и то не полностью. Оставшиеся 12 разрядов можно использовать для любой полезной инф - битовые флаги, поля итд. Фактически - структура. Отрицательные значения - это один из вариантов этого. (2) есть вроде не-дефакто-стандарты на именование различных типов. Тутуж кто-во-что горазд. A - чтоб мне (любимому) было понятно B - один из стандартов. AB или BA приоритет ставят по разному. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexRayne 7 25 мая, 2017 Опубликовано 25 мая, 2017 · Жалоба (1) да, допустим определены 10 констант - enum. При этом, если int 16-битный, задействовано только 4 разряда и то не полностью. Оставшиеся 12 разрядов можно использовать для любой полезной инф - битовые флаги, поля итд. Фактически - структура. да, легкая альтернатива структуре. Отрицательные значения - это один из вариантов этого. ну вариант не структуры, просто отрицательные числа используются. и на моей практике - как индикатор ошибки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 25 мая, 2017 Опубликовано 25 мая, 2017 · Жалоба Меня другой момент использования енумов занимает - последнее время вижу что народ константы перечисления делает большими буквами, что обычно выглядит как макро.Ну по смыслу такой enum эквивалентен набору макросов #define TAG1 VALUE1 #define TAG2 (TAG1 + 1) #define TAG3 (TAG2 + 1) поэтому вполне ожидаемо и аналогичное правило записи имен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 25 мая, 2017 Опубликовано 25 мая, 2017 · Жалоба По смыслу - enum это набор неизменяемых именованных значений, по умолчанию int, но можно и другого. А вель можно еще её сделать типом и использовать в параметрах, тогда людям понятнее что передается и что возращается. int Foo(..); или ERROR_STATUS Foo(...) А разве это не написано в книжках ? #define можно переопределить, а enum не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 25 мая, 2017 Опубликовано 25 мая, 2017 · Жалоба Список ошибок часто определяю так: 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 такой способ оптимальнее. B) Кто знает асм - поймёт. Оставшиеся 12 разрядов можно использовать для любой полезной инф - битовые флаги, поля итд. Фактически - структура. Если нужно вернуть 2 параметра, то лучше и возвращать их как 2, а не лепить из них одно в точке return, и не распаковывать потом в точке вызова. Если мне нужно например на 32-битной архитектуре вернуть 2 значения из функции, я делаю так: u64 FuncA() { u64 q = (u32)val1 | (u64)(u32)val2 << 32; return q; } Если пытаться всё лепить в одно 32-битное значение, то будет куча лишних команд при упаковке и потом - при распаковке. А в вышеприведённом случае - минимум команд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 26 мая, 2017 Опубликовано 26 мая, 2017 · Жалоба Ну по смыслу такой 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 компилятор не выдал. . . . . А разве это не написано в книжках ? Да у меня вопрос собст-но про отрицательные enum. В литературе как-то не натыкался на это. А проводить гугл-сеанс нет времени. Тем более можно спросить у "первоисточников" на этом форуме :) Список ошибок часто определяю так: . . . . Ok - спасибо за инф. Надо осмыслить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolyT 0 26 мая, 2017 Опубликовано 26 мая, 2017 · Жалоба Непонятно какие преимущества дает использование enum как типа возвращаемого значения функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться