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

 
 
> 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
 
Start new topic
Ответов
sigmaN
сообщение May 29 2017, 08:55
Сообщение #2


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Ну тогда надо конкретизировать на примерах.
Я так понимаю, что если для энума(для его хранения как вы говорите) будет выбран тип uint8_t то и аргумент функции тоже будет uint8_t и передача аргумента этой функции должна быть выполнена по тем-же правилам, что и передача аргумента с типом uint8_t. Как-то слишком уж глупо нечто, что хранится как uint8_t передавать в функцию по правилам uint16_t...

Конкретизируем.
STM8, IAR, функция с одинм аргументом.
По правилам передачи аргументов 8ми битные передаются через регистр А, 16ти битные через регистр X
Вы утрерждаете, что enum будет передан через регистр X не смотря на то, что в памяти будет занимать 8бит.
Правильно я понял ход ваших мыслей?

Код
typedef enum{
  TEST1,
  TEST2
} testEnum_t;

volatile testEnum_t te = TEST1; //to avoid inlining and optimizations

void testF(testEnum_t enm)
{
  nop();
    
  switch(enm)
  {
  case TEST1: GPIOA->ODR = 0;
    break;
  case TEST2: GPIOA->ODR = 0xff;
    break;
  }
  nop();
}



int main()
{
  testF(te);
}


Код
   327            testF(te);
   \   000008 C6 ....      LD        A, L:te
   \   00000B 9D           NOP
   \   00000C 27 09        JREQ      L:??main_0
   \   00000E 4A           DEC       A
   \   00000F 26 0A        JRNE      L:??main_1
   \   000011 35 FF 5000   MOV       L:0x5000, #0xff
   \   000015 20 04        JRA       L:??main_1
   \                     ??main_0:
   \   000017 725F 5000    CLR       L:0x5000
   \                     ??main_1:
   \   00001B 9D           NOP


Всё замечательно, аргумент функции в виде энума использует 8ми битный регистр A ибо весь энум помещается в 8бит.

исправляем так, чтоб энум стал 16бит. Всё остальное не меняем
Код
typedef enum{
  TEST1,
  TEST2 = 1024
} testEnum_t;

компилируем....
Код
    327            testF(te);
   \   000008 CE ....      LDW       X, L:te
   \   00000B 9D           NOP
   \   00000C 27 0B        JREQ      L:??main_0
   \   00000E 1D 0400      SUBW      X, #0x400
   \   000011 26 0A        JRNE      L:??main_1
   \   000013 35 FF 5000   MOV       L:0x5000, #0xff
   \   000017 20 04        JRA       L:??main_1
   \                     ??main_0:
   \   000019 725F 5000    CLR       L:0x5000
   \                     ??main_1:
   \   00001D 9D           NOP

используется регистр X.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 29 2017, 09:34
Сообщение #3


Гуру
******

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



Цитата(sigmaN @ May 29 2017, 10:55) *
Я так понимаю, что если для энума(для его хранения как вы говорите) будет выбран тип uint8_t то и аргумент функции тоже будет uint8_t и передача аргумента этой функции должна быть выполнена по тем-же правилам, что и передача аргумента с типом uint8_t. Как-то слишком уж глупо нечто, что хранится как uint8_t передавать в функцию по правилам uint16_t...

Глупо - это если сказано про расширение размера данных не понимать, что речь естественно идёт не о 8-битной архитектуре. Я говорил про 32-битный IAR for ARM.
И я написал: аргумент функции типа enum, а не u8 или u16.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- k155la3   CPP enum с минусовыми значениями   May 25 2017, 06:25
- - novikovfb   Почему бы и нет. Одно не понятно: чем запись minu...   May 25 2017, 06:32
|- - k155la3   Цитата(novikovfb @ May 25 2017, 09:32) По...   May 25 2017, 06:35
- - _pv   Цитатаinteger constant expression whose value is r...   May 25 2017, 07:22
|- - k155la3   "integer constant expression whose value is r...   May 25 2017, 07:32
|- - AlexRayne   Цитата(k155la3 @ May 25 2017, 11:32) Инте...   May 25 2017, 09:46
|- - k155la3   Цитата(AlexRayne @ May 25 2017, 12:46) . ...   May 25 2017, 10:35
||- - AlexRayne   Цитата(k155la3 @ May 25 2017, 14:35) (1) ...   May 25 2017, 12:27
|- - Сергей Борщ   QUOTE (AlexRayne @ May 25 2017, 12:46) Ме...   May 25 2017, 12:47
|- - k155la3   Цитата(Сергей Борщ @ May 25 2017, 15:47) ...   May 26 2017, 07:25
- - AnatolyT   Постоянно применяю, только не enum, а int. Обычная...   May 25 2017, 08:00
|- - k155la3   Цитата(AnatolyT @ May 25 2017, 11:00) . ....   May 25 2017, 08:47
- - x893   По смыслу - enum это набор неизменяемых именованны...   May 25 2017, 16:36
|- - jcxz   Список ошибок часто определяю так: enum {ERR_1 = 1...   May 25 2017, 20:47
- - AnatolyT   Непонятно какие преимущества дает использование en...   May 26 2017, 09:11
|- - novikovfb   Цитата(AnatolyT @ May 26 2017, 13:11) Неп...   May 26 2017, 09:46
||- - Сергей Борщ   QUOTE (novikovfb @ May 26 2017, 12:46) пр...   May 26 2017, 09:54
|- - k155la3   Цитата(AnatolyT @ May 26 2017, 12:11) Неп...   May 26 2017, 10:01
|- - jcxz   Цитата(k155la3 @ May 26 2017, 12:01) Кром...   May 28 2017, 10:26
- - sigmaN   По-моему идеально использовать enum по возможности...   May 26 2017, 10:10
|- - AlexRayne   Цитата(sigmaN @ May 26 2017, 13:10) Кодty...   May 26 2017, 13:33
|- - k155la3   Цитата(AlexRayne @ May 26 2017, 16:33) si...   May 26 2017, 14:38
- - AnatolyT   Может быть чтобы не было соблазна добавить в начал...   May 26 2017, 10:25
- - sigmaN   ЦитатаМожет быть чтобы не было соблазна добавить в...   May 26 2017, 10:58
- - sigmaN   Цитатаа почему Вы большими буквами значения енума ...   May 26 2017, 15:45
|- - dxp   QUOTE (sigmaN @ May 26 2017, 22:45) да эт...   May 27 2017, 05:21
|- - AlexRayne   Цитата(dxp @ May 27 2017, 09:21) Скорее н...   May 29 2017, 07:42
- - sigmaN   Кстати вы заметили, как в С++11 поправили enum? Я ...   May 28 2017, 09:13
|- - dxp   QUOTE (sigmaN @ May 28 2017, 16:13) Кстат...   May 28 2017, 13:02
- - sigmaN   ЦитатаThe enum type The compiler will use the smal...   May 28 2017, 11:17
|- - jcxz   Цитата(sigmaN @ May 28 2017, 13:17) The c...   May 29 2017, 08:35
- - sigmaN   ЦитатаТолько enum class - это, я понял, как раз со...   May 28 2017, 13:50
- - sigmaN   Вот и я гворю: уточнять надо. Кто куда и кого расш...   May 29 2017, 10:10


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 09:50
Рейтинг@Mail.ru


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