Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.83
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

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

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

Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не стандартные define-ы,а перечисление enum.
Можно ли задать тип значений для членов enum явно(мне в конкретном случае нужен unsigned int)?
Что будет при битовой операции,если значение результата выходит за пределы типа (даже не уверен,возможно ли,но вроде бы да)?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2010, 20:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? (C++):

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

Какой тип данных правильный при определении времени выполнения? - C++
Народ, какой тип данных привильный. При прирывании счетчик повышает значение на 1(левая колонка), в правой микросекунды. Отрывок кода ...

Как проверить какой тип данных вводится? - C++
Доброго времени суток. Подскажите пожалуйста!С клавиатуры вводится два целых числа.Как после ввода проверить,что было введено именно...

Как осуществить ввод числа, не зная какой тип числа будет введён? - C++
И не объявляя вводимую переменную как double...

Какой символьный тип использует тип std::string? - C++
Какой тип данных использует класс String? Char? И написано ли это в в документе #include <string>?

Как сделать тип enum в структуре беззнаковым - C++
Почему элемент Type структуры BracketBlock signed и как его сделать unsigned, не увеличивая количество бит Type? enum BracketType { ...

25
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
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
18910 / 6869 / 503
Регистрация: 30.03.2009
Сообщений: 19,340
Записей в блоге: 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
fasked
Эксперт С++
4975 / 2555 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
07.08.2010, 00:04 #18
Цитата Сообщение от Evg Посмотреть сообщение
Я ведь про NULL объяснял. Это некое значение, которое не может принимать ни один из указателей на языковую переменную или результат выделения динамической памяти. Присваивать в целочисленное поле значение указателя (а NULL - это указатель) - это не есть правильно. Нужно инициализировать значением 0
разве NULL это не 0, то есть
#define NULL 0
во всяком случае в Си++. понятное дело, что концептуально не правильно не указатели приравнивать к NULL, но с технической точки зрения какая разница, если это именованная константа.
0
Evg
Эксперт CАвтор FAQ
18910 / 6869 / 503
Регистрация: 30.03.2009
Сообщений: 19,340
Записей в блоге: 30
07.08.2010, 00:07 #19
Цитата Сообщение от fasked Посмотреть сообщение
разве NULL это не 0, то есть
[C/C++]Компилятор g++.Странности с true и false.Кто нибудь может прокомментировать/повторить это у себя?
1
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
07.08.2010, 00:09  [ТС] #20
Цитата Сообщение от fasked Посмотреть сообщение
разве NULL это не 0, то есть
#define NULL 0
во всяком случае в Си++. понятное дело, что концептуально не правильно не указатели приравнивать к NULL, но с технической точки зрения какая разница, если это именованная константа.
Это вроде может зависеть от реализации,то есть может быть
C++
1
#define NULL (void *)0
и на разных платформах могут быть свои значения NULL,как я помню из объяснений Evg.
0
Evg
Эксперт CАвтор FAQ
18910 / 6869 / 503
Регистрация: 30.03.2009
Сообщений: 19,340
Записей в блоге: 30
07.08.2010, 00:14 #21
В любом случае значение NULL связывать с пустой маской - неправильно. Потому как одно - указатель в память, а другое - целое число (набор битов)
1
Mr.X
Эксперт С++
3060 / 1705 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
07.08.2010, 00:14 #22
Цитата Сообщение от fasked Посмотреть сообщение
разве NULL это не 0, то есть
#define NULL 0
во всяком случае в Си++.
В C++ Страуструп вообще не рекомендует применять эту сишную примочку (злосчастный макрос NULL, как он его называет), а везде использовать нормальный человеческий 0.
1
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
07.08.2010, 00:16  [ТС] #23
Цитата Сообщение от Evg Посмотреть сообщение
В любом случае значение NULL связывать с пустой маской - неправильно. Потому как одно - указатель в память, а другое - целое число (набор битов)
Постараюсь больше не забывать
0
Evg
Эксперт CАвтор FAQ
18910 / 6869 / 503
Регистрация: 30.03.2009
Сообщений: 19,340
Записей в блоге: 30
07.08.2010, 00:19 #24
Цитата Сообщение от Mr.X Посмотреть сообщение
В C++ Страуструп вообще не рекомендует применять эту сишную примочку (злосчастный макрос NULL, как он его называет).
А что же он рекомендует применять? Я понимаю, если бы хотя бы класс std::string был сделан по-человечески, так ведь в нём нет нормального аналога NULL'а.
0
fasked
Эксперт С++
4975 / 2555 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
07.08.2010, 00:30 #25
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от #pragma Посмотреть сообщение
Это вроде может зависеть от реализации,то есть может быть
C++
1
#define NULL (void *)0
вот как раз таки на Си++ так делать нельзя, из указателя типа void запрещено неявное преобразование в указатели любых других типов.
я потому и заинтересовался, что везде NULL в принципе объявляется обычным целочисленным значением.
плюс к тому же вот слова Страуструпа:
In C++, the definition of NULL is 0, so there is only an aesthetic difference. I prefer to avoid macros, so I use 0. Another problem with NULL is that people sometimes mistakenly believe that it is different from 0 and/or not an integer. In pre-standard code, NULL was/is sometimes defined to something unsuitable and therefore had/has to be avoided. That's less common these days.
Может в Си NULL и бывает разный, но в Си++ по стандарту всегда ноль.

я не спорю с тем, что NULL нельзя присваивать целочисленным значениям. но это возможно.

Добавлено через 3 минуты
Цитата Сообщение от Evg Посмотреть сообщение
А что же он рекомендует применять? Я понимаю, если бы хотя бы класс std::string был сделан по-человечески, так ведь в нём нет нормального аналога NULL'а.
в новом стандарте появился nullptr - специально для указателей.
If you have to name the null pointer, call it nullptr; that's what it's going to be called in C++0x. Then, "nullptr" will be a keyword.
3
Evg
Эксперт CАвтор FAQ
18910 / 6869 / 503
Регистрация: 30.03.2009
Сообщений: 19,340
Записей в блоге: 30
07.08.2010, 09:58 #26
Цитата Сообщение от fasked Посмотреть сообщение
Может в Си NULL и бывает разный, но в Си++ по стандарту всегда ноль.
Возможно. Я просто про Си++ мало что знаю и всё как-то подсознательно в контексте языка си пишу

Цитата Сообщение от fasked Посмотреть сообщение
в новом стандарте появился nullptr - специально для указателей
А в старом стандарте-то что было? Если кто-то не рекомендует чем-то пользоваться, то как минимум для приличия надо порекомендовать что-то взамен

Добавлено через 10 минут
Цитата Сообщение от fasked Посмотреть сообщение
я не спорю с тем, что NULL нельзя присваивать целочисленным значениям. но это возможно
Посмотрел на код из-под g++. Там в качестве NULL везде задефайнено значение __null. Даже при опциях типа -ansi (т.е. "старый" стандарт). Я правильно понимаю, что __null изначально было в Си++ и предполагало некое значение, соотвествующее "пустому" значению? Или всё-таки оно означает некоторое "несуществующее" значение? Мне бы было интересно узнать этот момент поподробнее

Исходя из этого можно будет понять правильный ответ на вопрос из поста #7 и прикинуть, что там с аналогом NULL в std::string. По последнему вопросу особенно интересуем вариант состыковки кодов на Си и Си++: выработка NULL на Си и присваивание значения в string, далее передача string'а транзитом через коды Си++, а затем опять передача в Си. Дойдёт значение NULL или нет?
0
07.08.2010, 09:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2010, 09:58
Привет! Вот еще темы с ответами:

Как результат функции конвертировать в тип Enum? - C++
Кто может подсказать как мне результат функции конвертировать в тип Enum, тоесть чтобы результат функции сравнивало со значениями в этом...

Какой будет тип у переменной auto, которой присвоили лямда-функцию - C++
Добрый день. Скажите пожалуйста, какой тип будет у переменной auto, которой присвоили лямбда функцию. Например: ... auto x =...

Зачем нужно явно указывать тип переменной? - C++
Всем привет! Объясните зачем нужно явно указывать тип переменной? Например в С++ это обязательно, а php нет. Просто говорят что не...

Путаница с типами данных TCHAR и char. Какой тип данных выбрать? - C++
Я создавал тему в соседнем разделе:http://www.cyberforum.ru/cpp-networks/thread1119035.html Насколько я понял, то POST-данные в TCHAR...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru