Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/86: Рейтинг темы: голосов - 86, средняя оценка - 4.69
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
1

Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении?

06.08.2010, 20:13. Показов 15810. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не стандартные define-ы,а перечисление enum.
Можно ли задать тип значений для членов enum явно(мне в конкретном случае нужен unsigned int)?
Что будет при битовой операции,если значение результата выходит за пределы типа (даже не уверен,возможно ли,но вроде бы да)?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2010, 20:13
Ответы с готовыми решениями:

Какой тип данных использует VBA, если тип явно не объявлен
Какой тип данных использует VBA, если тип явно не объявлен

Как понять, какое значение будет возвращено на выходе, как явно задать тип возвращаемого значения
Здравствуйте. Недавно начал изучать язык VBA. Не могу уяснить логику работы с функциями. До...

Как избавиться от необходимости явно указывать тип в enum?
Как сделать, чтобы для перечислений не нужно было явно указывать тип int? switch (direction) ...

Какой тип (типы) следует указать при написании переменной,которая будет принимать заданные значения?
Какой тип (типы) следует указать при написании переменной,которая будет принимать заданные...

25
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
06.08.2010, 20:47 2
Цитата Сообщение от #pragma Посмотреть сообщение
Что будет при битовой операции,если значение результата выходит за пределы типа
это как это?

Добавлено через 5 минут
Цитата Сообщение от #pragma Посмотреть сообщение
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не стандартные define-ы,а перечисление enum.
приведи пример, пожалуйста. что-то я не очень понимаю, как ты хочешь передавать параметры.
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.08.2010, 21:04  [ТС] 3
Цитата Сообщение от fasked Посмотреть сообщение
это как это?
Ну вот скажем есть число 0x100000000 в hex которое равно 4,294,967,295 (максимальное unsigned int)
Второе число,скажем 0x0000FFFFF
Их побитовое "или" даёт результат 0x1000FFFFF что равняется 4,296,015,871 и уже выходит за границы диапазона типа unsigned int. В принципе побитовое "и" так же хорошо будет работать и с этим числом,но какого оно типа? Есть ли тут "подводные камни"?
Понятно,что подобные вопросы из-за пробелов в знаниях темы, так что не ругать
Цитата Сообщение от fasked Посмотреть сообщение
приведи пример, пожалуйста. что-то я не очень понимаю, как ты хочешь передавать параметры.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
enum ARGS {
   ARG1 = 0x000000001,
   ARG2 = 0x0000000F0
}
...
bool MyFunction (int param1, uint32_t result_arg) {
   if (result_arg & ARG1)
   {
      ...
   }
}
...
MyFunction(parameter1, ARG1 | ARG2 ) ;
...
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
06.08.2010, 21:30 4
Цитата Сообщение от #pragma Посмотреть сообщение
Ну вот скажем есть число 0x100000000
ты немного ошибаешься. максимальное значение для unsigned int - 0xFFFFFFFF. то есть то число, которые ты написал, но меньше на единицу.
а битовые операции, они на то и битовые, что действие происходит между двумя битами. один бит одного числа и один бит другого. соответственно никакой речи о выходах за пределы здесь не может быть.

По поводу перечислений точно не знаю. Но sizeof возвращает 4 байта. Так что скорее всего это unsigned int.
2
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.08.2010, 21:38  [ТС] 5
Спасибо,по поводу операций разъяснил
Про то,как задавать тип явно и возможно ли это,вопрос открыт.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
06.08.2010, 22:12 6
#pragma, именованные константы, которые должны складываться логическим ИЛИ определяются степенями двойки
C
1
enum { GOOD = 0, BADLY = 1, VERY_BADLY = 2, VERY_VERY_BADLY = 4, WORSE_THAN_EVER = 8, LITTLE_BIT_MORE_BADLY = 16 };
иначе отдельное значение просто не вытащить...
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.08.2010, 22:39  [ТС] 7
Ещё тут одна мелочь возникла по ходу написания: какое поведение будет у программы,если задать значения посылаемых аргументов по умолчанию равным NULL? Я понимаю,что будет некий крах,но что именно? И ещё: почему 0 & 1 является нелегальной операцией?
Пример:
C++
1
2
3
4
5
6
bool MyFunction(string param1, uint32_t args = NULL) {
   if ( args & ARG1 ) // ARG1 == 0x00000001
   {
      ...
   }
}
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
06.08.2010, 22:40 8
Цитата Сообщение от #pragma Посмотреть сообщение
Спасибо,по поводу операций разъяснил
Про то,как задавать тип явно и возможно ли это,вопрос открыт.
Нельзя. По стандарту тип enum - целый, а какой конкретно - зависит от реализации. В набор допустимых значений входят все элементы перечисления, а также те значения, которые можно записать при помощи того же количества битов.
1
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
06.08.2010, 22:44 9
Цитата Сообщение от fasked Посмотреть сообщение
Так что скорее всего это unsigned int.
C++
1
2
    enum {a = -1};
    cout << a;
Вроде как получается что signed.

Добавлено через 46 секунд
Цитата Сообщение от Mr.X Посмотреть сообщение
а какой конкретно - зависит от реализации.
Вон как. Ну по крайней мере в MSVS signed.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
06.08.2010, 22:47 10
Цитата Сообщение от Хохол Посмотреть сообщение
Вон как. Ну по крайней мере в MSVS signed.
это еще ничего не значит
C++
1
2
3
4
int main()
{
   unsigned int a = -1;
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
06.08.2010, 22:49 11
Цитата Сообщение от #pragma Посмотреть сообщение
почему 0 & 1 является нелегальной операцией?
это с какого перепуга?
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main(){
    std::cout << "0 & 1 = " << ( 0 & 1 ) <<std::endl;
    std::cout << "1 & 1 = " << ( 1 & 1 ) << std::endl;
    return 0;
}
Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении?
1
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
06.08.2010, 22:50 12
fasked, однако ж я cout не для красоты написал.
1
fasked
06.08.2010, 22:50
  #13

Не по теме:

Цитата Сообщение от Хохол Посмотреть сообщение
Однако ж я cout не для красоты написал.
извини, я не заметил :)

0
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.08.2010, 23:26  [ТС] 14
Цитата Сообщение от easybudda Посмотреть сообщение
это с какого перепуга?
Да,точно,всё работает,просто почему-то убунтовый калькулятор считает эту операцию нелегальной ,это странно

Добавлено через 33 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
#pragma, именованные константы, которые должны складываться логическим ИЛИ определяются степенями двойки
C
1
enum { GOOD = 0, BADLY = 1, VERY_BADLY = 2, VERY_VERY_BADLY = 4, WORSE_THAN_EVER = 8, LITTLE_BIT_MORE_BADLY = 16 };
иначе отдельное значение просто не вытащить...
А можно объяснение,почему? У меня вроде работает.
То есть такая комбинация
C++
1
2
3
4
           ARG1 = 0x00001,
           ARG2 = 0x00020,
           ARG3 = 0x00300,
           ARG4 = 0x04000,
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
06.08.2010, 23:37 15
Цитата Сообщение от #pragma Посмотреть сообщение
Можно ли задать тип значений для членов enum явно(мне в конкретном случае нужен unsigned int)?
Задать явно точно нельзя. Как определяется sizeof enum'а - надо курить стандарт. Но вроде бы гарантируется, что влезает как минимум в размер int'а

Что касается битовых масок, то концептуально их делать через enum неправильно, потому как через их побитовую комбинацию получается значение, которое в enum'е отсутствует. Если посмотришь чужой софт на Си, то везде используют int'ы (в смысле базовые типы) и define'ы со значениями. На Си++ видел какие-то ацкие мегаконцепты, что создаются классы, а маска формируется через операцию "<<"

Цитата Сообщение от #pragma Посмотреть сообщение
если задать значения посылаемых аргументов по умолчанию равным NULL?
Я ведь про NULL объяснял. Это некое значение, которое не может принимать ни один из указателей на языковую переменную или результат выделения динамической памяти. Присваивать в целочисленное поле значение указателя (а NULL - это указатель) - это не есть правильно. Нужно инициализировать значением 0
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.08.2010, 23:49  [ТС] 16
Почему я enum выбрал. у меня функция выглядит так (ещё не доделал)
код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
        /// ---------------------------------------------------------------- ///
        enum IS_CONFLICTING_DECLARATION_ARGS {//This is only a try,
                                              //possibly to be removed
           SEARCH_IN_SHARED_VARS      = 0x000001,
           SEARCH_IN_SHARED_ARRS      = 0x000020,
           SEARCH_IN_SHARED_LBLS      = 0x000300,
           SEARCH_IN_GLOBAL_FNCS      = 0x004000,
           SEARCH_IN_ALL_DATA         = 0x050000,
           SEARCH_SHARED_DATA_ONLY    = 0x600000
        };
 
        bool isConflictingDeclaration (string declared_name, _uint32_t args = 0)
        {
           if (
                (findVarName (declared_name, current_funcs) >= 0) ||
                (findVarName (declared_name, current_vars ) >= 0) ||
                (findVarName (declared_name, current_arrs ) >= 0) ||
                (findVarName (declared_name, current_lbls ) >= 0)
              )
              return true;
 
           // Only checking current (local) variables
           if ( args == 0 )
              // Conflicting = no
              return false;
 
           if (
                 ( (args & SEARCH_IN_GLOBAL_FNCS) &&
                   (findVarName (declared_name,functions_stack->front()) >= 0) )
 
                                            ||
 
                 (  (args & SEARCH_IN_SHARED_VARS) &&
                    has_shared_vars                &&
                    (findVarName (declared_name,shared_vars) >= 0)  )
 
                                            ||
 
                 (  (args & SEARCH_IN_SHARED_ARRS) &&
                    has_shared_arrs                &&
                    (findVarName (declared_name,shared_arrs) >= 0)  )
              )
              return true;
 
           // Conflicting = no
           return false;
        }
        /// ---------------------------------------------------------------- ///

И весь этот код сидит внутри класса,включая enum.
А вызов функции выглядит так:
C++
1
2
if ( pool.isConflictingDeclaration (name,pool.SEARCH_IN_ALL_DATA) )
...
С define-ми так не получится
Вся идея этого enum-а - использовать как дополнение к конкретной функции,то есть более ни в каких операциях он не должен учавствовать. Ну не знаю,может,это и плохо,в любом случае можно сделать некое поле констант или ещё что. Вопрос был чисто теоретический
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
06.08.2010, 23:57 17
А с Define'ами-то что не получается? Должно быть всё то же самое

Добавлено через 2 минуты
Чем enum принципиально лучше - его можно спрятать в класс, чего с define'ами не сделать. Я бы рядом с enum IS_CONFLICTING_DECLARATION_ARGS завёл "typedef unsigned trampampam" и для параметра args использовал бы этот тип. Когда описания типов лежат рядом - так хотябы будет проще код читать. В enum'е бы ещё завёл поле что-то типа "SEARCH_NULL = 0x00000000" и в качестве дефолтного значения args вписывал бы этот элемент
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
07.08.2010, 00:04 18
Цитата Сообщение от Evg Посмотреть сообщение
Я ведь про NULL объяснял. Это некое значение, которое не может принимать ни один из указателей на языковую переменную или результат выделения динамической памяти. Присваивать в целочисленное поле значение указателя (а NULL - это указатель) - это не есть правильно. Нужно инициализировать значением 0
разве NULL это не 0, то есть
#define NULL 0
во всяком случае в Си++. понятное дело, что концептуально не правильно не указатели приравнивать к NULL, но с технической точки зрения какая разница, если это именованная константа.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.08.2010, 00:07 19
Цитата Сообщение от fasked Посмотреть сообщение
разве NULL это не 0, то есть
[C/C++]Компилятор g++.Странности с true и false.Кто нибудь может прокомментировать/повторить это у себя?
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
07.08.2010, 00:09  [ТС] 20
Цитата Сообщение от fasked Посмотреть сообщение
разве NULL это не 0, то есть
#define NULL 0
во всяком случае в Си++. понятное дело, что концептуально не правильно не указатели приравнивать к NULL, но с технической точки зрения какая разница, если это именованная константа.
Это вроде может зависеть от реализации,то есть может быть
C++
1
#define NULL (void *)0
и на разных платформах могут быть свои значения NULL,как я помню из объяснений Evg.
0
07.08.2010, 00:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2010, 00:09
Помогаю со студенческими работами здесь

Какой тип данных надо задать для ввода произвольной функции F (x) с клавиатуры
Доброго времени суток! Немогу понять какой тип данных надо задать для ввода произвольной функции...

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си?
Добрый вечер! Был бы очень признателен, если бы Вы помогли бы мне понять нижеследующие вопросы:...

Добавить свой тип (Enum) в тип переменной My.Settings
Доброй ночи! В принципе название темы говорит само за себя. Нужен параметр приложения с моим типом...

Не могу явно преобразовать тип данных. Hibernate
Здравствуйте, уважаемые форумчане. Подскажите пожалуйста с данным вопросом...

Тип данных ENUM
вообщем, имею в таблице поле с типом данных ENUM (переключаемое которое). Значения - 'y','n' по...

Тип данных enum
Здравствуйте. Как работать с этим типом поля? Можно ли вытаскивать данные о возможных вариантах....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru