Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация перечисляемой переменной 
:(
    Опции темы
and277
Дата 12.7.2009, 09:26 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Привет ребята. Подскажите почему нельзя инициализировать перечисл. переменную с помощью потока ввода.
Вообщем я хочу инициал-ть переменную вводя её значение с клавы.

Например, вот так:

Код

enum etype {odin, dva, tri};

etype e1;

cin >>  e1;


Знаю, что новые компиляторы не допускают инициализировать перечисл. переменную целым числом напрямую: e1 = 2. Но в данном случае я буду вводить в строчном виде, например -  odin.

В чем проблема собственно -ведь перечисления является стандартным типом данных ?

Это сообщение отредактировал(а) and277 - 12.7.2009, 09:28
PM MAIL   Вверх
zim22
Дата 12.7.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(and277 @  12.7.2009,  09:26 Найти цитируемый пост)
В чем проблема собственно -ведь перечисления является стандартным типом данных ?

вот пример работы с перечислениями:
Код

#include <map>
#include <string>
#include <iostream>

int main()
{
  enum eZorro { BAM, TRAM, TARARAM };
  eZorro e1 = BAM;
  
  int x = 2;
  eZorro e2 = eZorro(x);

  std::map<std::string, eZorro> mZorro;
  mZorro["bam"] = BAM;
  mZorro["tram"] = TRAM;
  mZorro["tararam"] = TARARAM;
  
  std::string text;
  std::cin >> text;  

  eZorro e3 = BAM;  
  std::map<std::string, eZorro>::iterator zorro_it = mZorro.find(text);
  if (zorro_it != mZorro.end()) {
    e3 = eZorro(zorro_it->second);
  }              
  return 0;
}



Это сообщение отредактировал(а) zim22 - 12.7.2009, 10:07


--------------------
PM MAIL   Вверх
and277
Дата 12.7.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



zim22, благодарю.
Честно, не думал что придется юзать STL для этого. smile 
Свиду перечисления такие мягкие и пушистые...
PM MAIL   Вверх
Cheloveck
Дата 12.7.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Код

enum etype
{
  zero,
  one,
  two,
  three
};

int main()
{
  int val;
  std::cout << "Enter value: ";
  std::cin >> val;
  if( val < zero || val > three )
  {
    std::cerr << "Invalid value\n";
    return 1;
  }

  etype myvar = (etype)val;

  return 0;

}


ИМХО не нужно никаких STL'ей тут.


--------------------
user posted image
PM Jabber   Вверх
mes
Дата 12.7.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Cheloveck @  12.7.2009,  13:38 Найти цитируемый пост)
ИМХО не нужно никаких STL'ей тут.


Цитата(and277 @  12.7.2009,  08:26 Найти цитируемый пост)
Но в данном случае я буду вводить в строчном виде, например -  odin

smile
так что  без (ассоциативного) массива  обойтись будет трудно smile


Это сообщение отредактировал(а) mes - 12.7.2009, 14:43


--------------------
PM MAIL WWW   Вверх
Cheloveck
Дата 12.7.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



А в строчном виде никакие перечисления и не помогут, только ассоциации. Но это уже, из другой оперы.

Добавлено через 2 минуты и 15 секунд
Цитата(and277 @  12.7.2009,  10:26 Найти цитируемый пост)
Но в данном случае я буду вводить в строчном виде, например -  odin.


enum целочисленный, поэтому о перичислении можно говорить только как о индексе. ИМХО проще ввести число, чем проверять строки.


--------------------
user posted image
PM Jabber   Вверх
zim22
Дата 12.7.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Cheloveck @  12.7.2009,  14:38 Найти цитируемый пост)
  if( val < zero || val > three )

Cheloveck, что вы здесь пытались сделать? допустимый диапазон значений перечисления определяется по-другому.
в данном случае он будет [0; 7]
***
а если у нас перечисление не последовательное? что будете делать?
Код

enum etype
{
  zero = 10,
  one = 5,
  two = 44,
  three = -100
};

имхо, значения перечисления - это детали реализации, а не интерфейса. и напрямую их вводить - не правильно.

Это сообщение отредактировал(а) zim22 - 12.7.2009, 15:36


--------------------
PM MAIL   Вверх
Cheloveck
Дата 12.7.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Цитата(zim22 @  12.7.2009,  16:30 Найти цитируемый пост)
в данном случае он будет [0; 7]

Код

sergey:/tmp/test$ ./test
Enter value: 0
sergey:/tmp/test$ ./test
Enter value: 1
sergey:/tmp/test$ ./test
Enter value: 2
sergey:/tmp/test$ ./test
Enter value: 3
sergey:/tmp/test$ ./test
Enter value: 4
Invalid value


Цитата(zim22 @  12.7.2009,  16:30 Найти цитируемый пост)
а если у нас перечисление не последовательное? что будете делать?

Кажется у меня в примере нет никаких "если". Я не панацею показал, а пример.



--------------------
user posted image
PM Jabber   Вверх
mes
Дата 12.7.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Cheloveck @  12.7.2009,  13:38 Найти цитируемый пост)
enum etype
{
  zero,
  one,
  two,
  three
};

Цитата(zim22 @  12.7.2009,  14:30 Найти цитируемый пост)
в данном случае он будет [0; 7]

позвольте узнать почему  smile

Добавлено через 3 минуты и 31 секунду
А ... Вы о том, какие значения могут в него уложиться ?! Но это несколько не тот диапозон, который проверял Cheloveck smile

Добавлено через 6 минут и 30 секунд
P.S. кстати для 0-3 достаточно двух битов .. 


--------------------
PM MAIL WWW   Вверх
zim22
Дата 12.7.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Cheloveck @  12.7.2009,  15:39 Найти цитируемый пост)
. Я не панацею показал, а пример.

плохой пример. он работает правильно только когда луна находится в фазе сатурна и на тип перечисления наложены ограничения.
Цитата(mes @  12.7.2009,  15:46 Найти цитируемый пост)
А ... Вы о том, какие значения могут в него уложиться ?!

угу, Страуструпа начитался smile


--------------------
PM MAIL   Вверх
Cheloveck
Дата 12.7.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Цитата(zim22 @  12.7.2009,  17:19 Найти цитируемый пост)
плохой пример. он работает правильно только когда луна находится в фазе сатурна и на тип перечисления наложены ограничения.

Пример ввода данных с клавиатуры. Он работает в данном случае. Если луна выйдет из фазы сатурна, то у программиста есть руки и возможность сделать проверку для каждого конкретного случая. Если речь идёт о размерности типа, то тут проверки так же можно сделать динамически или статически. Не понимаю в чём могут быть проблемы восприятия этого примера. Показано, что нужно прочитать в переменную, проверить, принадлежит ли значение списку перечисления и присвоить переменной этого типа. Где что не правильно? Способы могут быть любые, в зависимости от нужды. В моём случае типа int хватит даже для DOS'а, когда он был 2-хбайтным ( да, собственно мне и байта достаточно ). Поэтому никаких проверок нет. ИМХО претензии высосаны из пальца.

Цитата(zim22 @  12.7.2009,  17:19 Найти цитируемый пост)
на тип перечисления наложены ограничения.

Это константы, на консанты всегда наложены ограничения. При том ограничения накладывает программист!!!

Или я должен писать листинги на 500 строк, чтобы продемонстрировать обработку всех возможных ситуаций? Может сохранять значение на диск, ведь питание может отрубиться?

Это сообщение отредактировал(а) Cheloveck - 12.7.2009, 16:46


--------------------
user posted image
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0847 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.