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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> typedef enum :: имя по значению? 
:(
    Опции темы
Usya
Дата 6.2.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте.

Есть код, что-то вроде:
Код

typedef enum 
{
     Red=1;
     Green=2;
     Blue=3;
     White=4;
     Yellow=5;
} TMyColor;


Возможно ли определить имя по значению?

Делать строковый массив и по индексу возвращать значения - не вариант: типов несколько, да и имена возможно могут со временем измениться и тогда надо будет переопределять массив (причем об этом еще и вспомнить потом надо). Переменные описаны в другом модуле (ях), хотя это не принципиально.

Заранее благодарен.

--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
SenkraD
Дата 6.2.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Usya, нет.
А, вообще, зачем такой изврат? - это уже кривое решение по определению

Цитата

типов несколько, да и имена возможно могут со временем измениться и тогда надо будет переопределять массив (причем об этом еще и вспомнить потом надо)

От этого вообще нет защиты, кроме контракта между девелоперами


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
EvilsInterrupt
Дата 6.2.2009, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Usya
В Дельфи можно через RTTI , может и в С++ также )
PM MAIL WWW ICQ Jabber   Вверх
SenkraD
Дата 7.2.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



EvilsInterrupt, нельзя это через RTTI сделать так, как компилятор транслирует его как макрос (хотя могу ошибатся)
 Чуть не к теме, но иногда из-за этого страдают на sizeof'ав


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
mes
Дата 7.2.2009, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Usya @  6.2.2009,  17:55 Найти цитируемый пост)

Делать строковый массив и по индексу возвращать значения - не вариант: типов несколько, да и имена возможно могут со временем измениться и тогда надо будет переопределять массив (причем об этом еще и вспомнить потом надо).

запихнуть всю логику преобразований значений в строки в один класс. Т.е написать к примеру класс Color, в котором определить нужные енумы
и сделать (скорей всего статический) метод по возвращению имени от значения.

надеюсь я правильно, хотя, однозначно, не до конца, уловил смысл вопроса..



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


Бывалый
*


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

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



SenkraD
Ответ простой: допустим мне нужно сформировать отчет, в котором в ячейки необходимо вставить вместо значений соответствующие имена.

EvilsInterrupt
+1

mes
Переменные для моей задачи определены в другом модуле, так что приходится работать с тем, что есть и дублировать их в том или ином виде не хочется. Если бы задача была разовой, то это одно дело, а если прогу необходимо будет со временем модифицировать, то это прямая дорога к глюкам - нужно будет держать в голове где и что дублируется. Были бы модули мои - там бы можно было и похозяйничать.

Пару ссылок думаю окажутся полезными:
http://www.rsdn.ru/Forum/Message.aspx?mid=292629&only=1
и
http://it.huij.net/html/Borland_jishushequ...1019/21930.html

Всем спасибо!  smile  


Это сообщение отредактировал(а) Usya - 9.2.2009, 19:01
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Usya
Дата 7.2.2009, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



P.s.

Забыл добавить: если класс уже определен, то все гораздо упрощается и получается что-то вроде
Код

...
//получение информации о свойстве, имеющего тип TWindowState
Typinfo::PTypeInfo pTypeInfo =*(Typinfo::GetPropInfo(__typeinfo(TForm),"WindowState"))->PropType;
//запись значения enum в символьном виде 
Writer->WriteIdent(GetEnumName(pTypeInfo,Form->FWindowState));
...


Взял отсюда http://bcdev.narod.ru/Code.htm, хотя это не единственная копия. Где оригинал, не знаю, да и в данном случае не столь важно  smile 

Это сообщение отредактировал(а) Usya - 9.2.2009, 19:02
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Usya
Дата 9.2.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Господа, я нашел косяк в работе приведенных в ссылках алгоритмах, хотя возможно он и в TypInfo.hpp.

Для вот такого примера
Код

#include <TYPINFO.HPP>
enum num {one,two,three,four,five};
num t=three;
class ___TEnumObject___ : TObject
{
private:
num _se;
__published:
__property num Prop ={read=_se};
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
PPropInfo p = GetPropInfo(__typeinfo(___TEnumObject___),"Prop");
Caption = GetEnumName(*(p->PropType), t);
}

все будет работать на ура,
а в таком уже
Код

#include <TYPINFO.HPP>
enum num {one=1,two=2,three=3,four=4,five=5}; //отличие в этой строке с перечислением
num t=two;
class ___TEnumObject___ : TObject
{
private:
num _se;
__published:
__property num Prop ={read=_se};
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
PPropInfo p = GetPropInfo(__typeinfo(___TEnumObject___),"Prop");
Caption = GetEnumName(*(p->PropType), t);
}

будет лажа со сдвигом на единицу, т.е. на двойку (t=two) будет выводиться трояк (three).

Не исключаю, что я мог что-то не то сделать, но все-таки это похоже на косяк :(

Надеюсь будет полезно знать тем, кто с этим столкнется, поэтому и дописал.

Это сообщение отредактировал(а) Usya - 9.2.2009, 19:20
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
EvilsInterrupt
Дата 9.2.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Цитата

Господа, я нашел косяк

я думал "Usya" следует читать как "Ася" и грешным делом подумал что ты ...
PM MAIL WWW ICQ Jabber   Вверх
Usya
Дата 10.2.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



EvilsInterrupt

Цитата

я думал "Usya" следует читать как "Ася"...


Ну рассмешил   smile . Буквы "U" и "A" вроде как-то не рядом. Тогда по-твоему имя Ваня следует читать, как Таня - отличие тоже всего-лишь в первой букве.

А Усей меня племянник назвал, когда еще только учился разговаривать!

P/s
Хотя это к теме и не относится.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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