Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > typedef enum :: имя по значению?


Автор: Usya 6.2.2009, 18:55
Здравствуйте.

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

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


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

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

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

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

Цитата

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

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

Автор: EvilsInterrupt 6.2.2009, 19:29
Usya, 
В Дельфи можно через RTTI , может и в С++ также )

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

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

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

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

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

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

EvilsInterrupt
+1

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

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

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

Автор: Usya 7.2.2009, 01:04
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:18
Господа, я нашел косяк в работе приведенных в ссылках алгоритмах, хотя возможно он и в 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).

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

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

Автор: EvilsInterrupt 9.2.2009, 19:45
Цитата

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

я думал "Usya" следует читать как "Ася" и грешным делом подумал что ты ...

Автор: Usya 10.2.2009, 16:23
EvilsInterrupt

Цитата

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


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

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

P/s
Хотя это к теме и не относится.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)