Форум программистов, компьютерный форум CyberForum.ru

обратный enum - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
borovik
208 / 202 / 1
Регистрация: 25.07.2010
Сообщений: 1,131
30.09.2011, 17:22     обратный enum #1
привет есть enum color {q,w,r,t,w,e,y,q};
как вернуть название (q,w,..) по номеру

типа

color c;
cout<<c(3) //вывод "r" третий элемент
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2011, 17:22     обратный enum
Посмотрите здесь:

C++ enum
enum C++
C++ enum
enum C++
C++ enum
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.09.2011, 17:32     обратный enum #2
Делаете массив имён, навроде
C++
1
2
3
4
5
6
7
8
9
10
11
12
/* -------------------------------------------------------------------------- */
  enum some_enum
  {
     Q,W,E,R,T,Y
  };
/* -------------------------------------------------------------------------- */
  const std::string enum_names [] =
  {
      "Q","W","E","R","T","Y"
  };
/* -------------------------------------------------------------------------- */
  std::cout << enum_names[some_enum(Q)];
Ещё гляньте эту тему, довольно интересно http://www.cyberforum.ru/cpp/thread47863.html
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.09.2011, 17:35     обратный enum #3
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
enum COLORS { RED = 0, GREEN, BLUE };
const char const * COLORNAME[] = { "Red", "Green", "Blue" };
 
int main(void){
    printf("%s %s %s\n", COLORNAME[RED], COLORNAME[GREEN], COLORNAME[BLUE]);
    
    return 0;
}
borovik
208 / 202 / 1
Регистрация: 25.07.2010
Сообщений: 1,131
30.09.2011, 17:39  [ТС]     обратный enum #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
/* -------------------------------------------------------------------------- */
  enum some_enum
  {
     Q,W,E,R,T,Y
  };
/* -------------------------------------------------------------------------- */
  const std::string enum_names [] =
  {
      "Q","W","E","R","T","Y"
  };
/* -------------------------------------------------------------------------- */
  std::cout << enum_names[some_enum(Q)];
если ставлю вместо Q число ошибки

easybudda, тоже самое
--------
у меня могут быть повторения типа
C++
1
2
3
4
 enum some_enum
  {
     Q,W,E,R,T,Y,Q,W,E,R,T,Y
  };
нужно вывести значения запрашиваемого номера
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.09.2011, 17:43     обратный enum #5
Цитата Сообщение от borovik Посмотреть сообщение
если ставлю вместо Q число ошибки

easybudda, тоже самое
--------
у меня могут быть повторения типа
C++
1
2
3
4
 enum some_enum
  {
     Q,W,E,R,T,Y,Q,W,E,R,T,Y
  };
нужно вывести значения запрашиваемого номера
Вы не сможете сделать повторения, тоже должны быть ошибки.
Вам что нужно, пройтись в цикле и распечатать? Когда будете делать цикл, просто объявите переменную типа some_enum и инкрементируйте её в цикле:
C++
1
2
3
for (some_enum i = Q; i <= Y; ++i) {
   std::cout << enum_names[some_enum(i)];
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.09.2011, 17:44     обратный enum #6
Цитата Сообщение от borovik Посмотреть сообщение
если ставлю вместо Q число ошибки
Это какие?
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
enum COLORS { RED = 0, GREEN, BLUE };
const char const * COLORNAME[] = { "Red", "Green", "Blue" };
 
int main(void){
    int i;
    for ( i = RED; i <= BLUE; ++i )
        printf("%s\n", COLORNAME[i]);
    
    return 0;
}
Код
C:\c_cpp\strings>colorname.exe
Red
Green
Blue
borovik
208 / 202 / 1
Регистрация: 25.07.2010
Сообщений: 1,131
30.09.2011, 17:56  [ТС]     обратный enum #7
easybudda, да работает )

а если так, не поможите исправить?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
enum x { RED, GREEN, BLUE };
enum x y[3] = { RED, GREEN, BLUE };
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    enum x id;
    id = y[2];
    cout<<id;
 
    getchar();
}
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.09.2011, 17:58     обратный enum #8
easybudda, ой, я только заметил, что всегда делал enum_names[some_enum(i)];
а ведь можно было просто enum_names[i] может ли у этого быть хоть какое-то полезное оправдание?

borovik, значения enum при компиляции обращаются в целое число (возможно я неправ тут, но enum похож на #define в Си,только у него есть тип), причём для этого типа не определена печать (можно распечатать только значения названий внутри enum, но не их самих, оттого и ошибки и необходимость в дополнительном строковом массиве.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.09.2011, 18:01     обратный enum #9
Цитата Сообщение от borovik Посмотреть сообщение
enum x y[3] = { RED, GREEN, BLUE };
Неправильная строка, если хотите объявить массив значений, тогда уберите ключевое слово enum из этой строки. 'x ' это уже тип.
borovik
208 / 202 / 1
Регистрация: 25.07.2010
Сообщений: 1,131
30.09.2011, 18:07  [ТС]     обратный enum #10
fasked, тогда это совсем ужасное получается

я просто гдето видел более читабельный способ чем у easybudda, выгллядит типо так

C++
1
2
3
4
5
6
7
enum x { RED, GREEN, BLUE };
enum x y[6] = { RED, GREEN, BLUE, RED, GREEN, RED };
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<???[4];  //чтобы вывело RED;
}
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.09.2011, 18:15     обратный enum #11
Цитата Сообщение от borovik Посмотреть сообщение
я просто гдето видел более читабельный способ
Вы ошиблись.

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
enum COLOR {
   RED, GREEN, BLUE
};
 
const char *COLOR_name[] = {
   "RED", "GREEN", "BLUE"
};
 
COLOR colors[] = {
   BLUE, RED, GREEN, BLUE, RED, RED
};
 
int main() {
   cout << COLOR_name[colors[0]] << endl;
   cout << COLOR_name[colors[1]] << endl;
   cout << COLOR_name[colors[4]] << endl;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.09.2011, 18:18     обратный enum #12
Цитата Сообщение от borovik Посмотреть сообщение
а если так, не поможите исправить?
Проблема в том, что компилятору на ваши красивые символические имена глубоко наплевать, и в готовой программе от них одни воспоминания останутся. Ну разве-что компилировать со всевозможными отладочными параметрами. И то символические имена вытащить не так просто будет... Это я к тому, что если хотите выводить имена своих констант, прийдётся эти имена в программе в виде строк хранить.


Цитата Сообщение от #pragma Посмотреть сообщение
может ли у этого быть хоть какое-то полезное оправдание?
не понял вопрос...
borovik
208 / 202 / 1
Регистрация: 25.07.2010
Сообщений: 1,131
30.09.2011, 18:24  [ТС]     обратный enum #13
fasked, большое спс то что нужно )))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2011, 18:27     обратный enum
Еще ссылки по теме:

C++ Enum
enum C++
C++ enum

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

Или воспользуйтесь поиском по форуму:
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.09.2011, 18:27     обратный enum #14
Цитата Сообщение от easybudda Посмотреть сообщение
не понял вопрос...
Я про разницу в цикле enum_names[some_enum(i)] и enum_names[i]. Получается,я по недосмотру и ошибочно делал лишнюю запись some_enum(i) внутри квадратных скобок? Практического толку от этого же быть не может? (может выход за пределы enum поймается, или нет?)
Yandex
Объявления
30.09.2011, 18:27     обратный enum
Ответ Создать тему
Опции темы

Текущее время: 05:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru