Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как отладчик получает текстовое представление элементов множества?  [new]
Чародей Ученика
Guest
Доброй ночи! Подскажите пожалуйста, а как отладчик получает текстовое представление элементов множества?
Я объявил перечисление и множество:
type
  EMyEnum = (
    MyEnumA,
    MyEnumB,
    MyEnumC
  );
  TMyEnum = EMyEnum;
  TMySet = Set Of TMyEnum;

Я могу получить текстовое представление run-time при помощи RTTI примерно так:
function MySetToText(MySet: TMySet): String;
var MyEnum: TMyEnum;
begin
Result:='[';
for MyEnum in MySet do
    begin
    if (Result.Length>1) then
        Result:=Result+', ';
    Result:=Result+GetEnumName(TypeInfo(TMyEnum), Ord(MyEnum));
    end;
Result:=Result+']';
end;

procedure TForm1.Button1Click(Sender: TObject);
var S: TMySet;
begin
S:=[MyEnumA, MyEnumC];
ShowMessage(MySetToText(S));
end;

Но если я сделаю так:
  EMyEnum = (
    MyEnumA = 0,
    MyEnumB = 15,
    MyEnumC = 30
  );

То код перестаёт компилироваться с ошибкой:
[dcc32 Error] : E2134 Type 'TMyEnum' has no type info

И так же GetTypeData(TypeInfo(TMySet)).TypeData.CompType тоже равно nil.

Но при этом отладчик всё равно в Watches показывает переменные типа TMyEnum и TMySet в виде имён.
Как именно он это делает? Могу ли я делать так же run-time? Хотя тут мне больше любопытно, чем для практики...
11 июл 18, 23:59    [21564490]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46085

Чародей Ученика
Как именно он это делает?

Через отладочную информацию в DCU файлах.

Posted via ActualForum NNTP Server 1.5

12 июл 18, 00:13    [21564522]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Чародей Ученика
Guest
Инспектор объектов получает через RTTI. А через что получает отладчик я как-то просто не задумывался.
Столкнувшись с фактом что инспектор навернулся, а отладчик как ни в чём не бывало получает, стало очевидно что последний - не из RTTI.
Собственно я и предпологал что возможно в отладочной информации что-то могло остаться, только думал что берёт из exe. Точно из DCU?

Ну а допустим у меня всё ещё имеются DCU, я их не удалял - могу ли в теории сделать run-time так же как отладчик?
12 июл 18, 00:24    [21564554]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
defecator
Member

Откуда:
Сообщений: 38823
Чародей Ученика
Инспектор объектов получает через RTTI. А через что получает отладчик я как-то просто не задумывался.
Столкнувшись с фактом что инспектор навернулся, а отладчик как ни в чём не бывало получает, стало очевидно что последний - не из RTTI.
Собственно я и предпологал что возможно в отладочной информации что-то могло остаться, только думал что берёт из exe. Точно из DCU?

Ну а допустим у меня всё ещё имеются DCU, я их не удалял - могу ли в теории сделать run-time так же как отладчик?


элементарно
function EMyEnum _Name(Value : EMyEnum ) : String ;
begin
     Result := GetEnumName(TypeInfo(TSymbolType),Integer(Value));
end ;
12 июл 18, 06:09    [21564674]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Cobalt747
Member

Откуда:
Сообщений: 2035
C'est la vie.
уверен, ты бы тоже не стал заморачиваться с такими клиентами, которые используют вместо приличного перечисления банальный набор констант.
12 июл 18, 09:52    [21564932]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1928
Чародей Ученика
Но если я сделаю так:
  EMyEnum = (
    MyEnumA = 0,
    MyEnumB = 15,
    MyEnumC = 30
  );

То код перестаёт компилироваться с ошибкой:
Дырявые енумы не имеют TypeInfo
12 июл 18, 12:07    [21565610]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Чародей Ученика
Guest
defecator
элементарно
function EMyEnum _Name(Value : EMyEnum ) : String ;
begin
     Result := GetEnumName(TypeInfo(TSymbolType),Integer(Value));
end ;
Что такое TSymbolType?

white_nigger
Дырявые енумы не имеют TypeInfo
Ну а этот-то не "дырявый":
type
  EMyEnum = (
    MyEnumA = 3,
    MyEnumB = 4,
    MyEnumC = 5
  );
И всё равно
[dcc32 Error] : E2134 Type 'TMyEnum' has no type info
Видимо должно быть одновременно "не дырявый" и "с нуля".

Но вопрос-то данной темы как бы не в этом...
13 июл 18, 11:19    [21568142]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
defecator
Member

Откуда:
Сообщений: 38823
Чародей Ученика
defecator
элементарно
function EMyEnum _Name(Value : EMyEnum ) : String ;
begin
     Result := GetEnumName(TypeInfo(TSymbolType),Integer(Value));
end ;

Что такое TSymbolType?


замени на EMyEnum
13 июл 18, 11:27    [21568170]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Чародей Ученика
Guest
Так об чём и речь в первом посте:
Чародей Ученика
код перестаёт компилироваться с ошибкой:
[dcc32 Error] : E2134 Type 'EMyEnum' has no type info

И вопрос-то - а возможно run-time повторить способность отладчика? Ему type info видимо не нужен.
13 июл 18, 11:37    [21568219]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46085

Чародей Ученика
а возможно run-time повторить способность отладчика?

Можно: сделай ассоциативный массив имён своих констант.

Posted via ActualForum NNTP Server 1.5

13 июл 18, 12:59    [21568580]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Чародей Ученика
Guest
При возможности/необходимости я бы мог это сделать. Это элементарно. Мне интересно как именно делает отладчик.
Компилятор создаёт ассоциативный массив имён перечисления и прячет в отладочной информации, а отладчик как-то его находит и берёт из него? Если так, то как он его находит?
13 июл 18, 13:20    [21568696]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Cobalt747
Member

Откуда:
Сообщений: 2035
Чародей Ученика,

В exe-нике точно есть.
Видимо, только ДСП :-(
13 июл 18, 13:29    [21568770]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
зонд
Guest
+ оффтоп
Cobalt747
ДСП
Древесно-стружечная плита???
13 июл 18, 13:45    [21568879]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
schi
Member

Откуда: Москва
Сообщений: 2601
Чародей Ученика
Компилятор создаёт ассоциативный массив имён перечисления и прячет в отладочной информации, а отладчик как-то его находит и берёт из него? Если так, то как он его находит?


Очевидно, знает, где искать. Поищи описание отладочной информации, тоже будешь знать.
13 июл 18, 14:09    [21569007]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Dimonka
Member

Откуда:
Сообщений: 1089
white_nigger
Чародей Ученика
Но если я сделаю так:
  EMyEnum = (
    MyEnumA = 0,
    MyEnumB = 15,
    MyEnumC = 30
  );

То код перестаёт компилироваться с ошибкой:
Дырявые енумы не имеют TypeInfo

Попахивает скерее дырявым TypeInfo и не полным RTTI.
13 июл 18, 19:24    [21569828]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Cobalt747
Member

Откуда:
Сообщений: 2035
Dimonka,

интересно, а как оно в других языках, например C#?
Там есть TypeInfo, и такие "дырявые" множества?
16 июл 18, 10:43    [21573475]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Василий 2
Member

Откуда:
Сообщений: 232
Мне кажется, это чисто паскалевская упрощалка-удобняшка типа массивов с регулируемым началом диапазона индекса, из-за которой в итоге больше проблем, нежели пользы
16 июл 18, 14:29    [21574774]     Ответить | Цитировать Сообщить модератору
 Re: Как отладчик получает текстовое представление элементов множества?  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 268
enum Suit { Diamonds = 5, Hearts, Clubs = 4, Spades };  



Да.. Какая дикость
16 июл 18, 15:53    [21575145]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить