Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как отладчик получает текстовое представление элементов множества? / 18 сообщений из 18, страница 1 из 1
11.07.2018, 23:59
    #39672795
Как отладчик получает текстовое представление элементов множества?
Доброй ночи! Подскажите пожалуйста, а как отладчик получает текстовое представление элементов множества?
Я объявил перечисление и множество:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
type
  EMyEnum = (
    MyEnumA,
    MyEnumB,
    MyEnumC
  );
  TMyEnum = EMyEnum;
  TMySet = Set Of TMyEnum;


Я могу получить текстовое представление run-time при помощи RTTI примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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;


Но если я сделаю так:
Код: pascal
1.
2.
3.
4.
5.
  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? Хотя тут мне больше любопытно, чем для практики...
...
Рейтинг: 0 / 0
12.07.2018, 00:13
    #39672801
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
Чародей УченикаКак именно он это делает?

Через отладочную информацию в DCU файлах.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.07.2018, 00:24
    #39672805
Как отладчик получает текстовое представление элементов множества?
Инспектор объектов получает через RTTI. А через что получает отладчик я как-то просто не задумывался.
Столкнувшись с фактом что инспектор навернулся, а отладчик как ни в чём не бывало получает, стало очевидно что последний - не из RTTI.
Собственно я и предпологал что возможно в отладочной информации что-то могло остаться, только думал что берёт из exe. Точно из DCU?

Ну а допустим у меня всё ещё имеются DCU, я их не удалял - могу ли в теории сделать run-time так же как отладчик?
...
Рейтинг: 0 / 0
12.07.2018, 06:09
    #39672827
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
Чародей УченикаИнспектор объектов получает через RTTI. А через что получает отладчик я как-то просто не задумывался.
Столкнувшись с фактом что инспектор навернулся, а отладчик как ни в чём не бывало получает, стало очевидно что последний - не из RTTI.
Собственно я и предпологал что возможно в отладочной информации что-то могло остаться, только думал что берёт из exe. Точно из DCU?

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

элементарно
Код: pascal
1.
2.
3.
4.
function EMyEnum _Name(Value : EMyEnum ) : String ;
begin
     Result := GetEnumName(TypeInfo(TSymbolType),Integer(Value));
end ;
...
Рейтинг: 0 / 0
12.07.2018, 09:52
    #39672905
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
C'est la vie.
уверен, ты бы тоже не стал заморачиваться с такими клиентами, которые используют вместо приличного перечисления банальный набор констант.
...
Рейтинг: 0 / 0
12.07.2018, 12:07
    #39673032
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
Чародей УченикаНо если я сделаю так:
Код: pascal
1.
2.
3.
4.
5.
  EMyEnum = (
    MyEnumA = 0,
    MyEnumB = 15,
    MyEnumC = 30
  );


То код перестаёт компилироваться с ошибкой:Дырявые енумы не имеют TypeInfo
...
Рейтинг: 0 / 0
13.07.2018, 11:19
    #39673586
Как отладчик получает текстовое представление элементов множества?
defecatorэлементарно
Код: pascal
1.
2.
3.
4.
function EMyEnum _Name(Value : EMyEnum ) : String ;
begin
     Result := GetEnumName(TypeInfo(TSymbolType),Integer(Value));
end ;

Что такое TSymbolType?

white_niggerДырявые енумы не имеют TypeInfoНу а этот-то не "дырявый":
Код: pascal
1.
2.
3.
4.
5.
6.
type
  EMyEnum = (
    MyEnumA = 3,
    MyEnumB = 4,
    MyEnumC = 5
  );

И всё равно
[dcc32 Error] : E2134 Type 'TMyEnum' has no type infoВидимо должно быть одновременно "не дырявый" и "с нуля".

Но вопрос-то данной темы как бы не в этом...
...
Рейтинг: 0 / 0
13.07.2018, 11:27
    #39673591
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
Чародей Ученикаdefecatorэлементарно
Код: pascal
1.
2.
3.
4.
function EMyEnum _Name(Value : EMyEnum ) : String ;
begin
     Result := GetEnumName(TypeInfo(TSymbolType),Integer(Value));
end ;


Что такое TSymbolType?


замени на EMyEnum
...
Рейтинг: 0 / 0
13.07.2018, 11:37
    #39673598
Как отладчик получает текстовое представление элементов множества?
Так об чём и речь в первом посте:Чародей Ученикакод перестаёт компилироваться с ошибкой:
[dcc32 Error] : E2134 Type 'EMyEnum' has no type info
И вопрос-то - а возможно run-time повторить способность отладчика? Ему type info видимо не нужен.
...
Рейтинг: 0 / 0
13.07.2018, 12:59
    #39673671
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
Чародей Ученикаа возможно run-time повторить способность отладчика?

Можно: сделай ассоциативный массив имён своих констант.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.07.2018, 13:20
    #39673695
Как отладчик получает текстовое представление элементов множества?
При возможности/необходимости я бы мог это сделать. Это элементарно. Мне интересно как именно делает отладчик.
Компилятор создаёт ассоциативный массив имён перечисления и прячет в отладочной информации, а отладчик как-то его находит и берёт из него? Если так, то как он его находит?
...
Рейтинг: 0 / 0
13.07.2018, 13:29
    #39673697
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
Чародей Ученика,

В exe-нике точно есть.
Видимо, только ДСП :-(
...
Рейтинг: 0 / 0
13.07.2018, 13:45
    #39673711
зонд
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
оффтопCobalt747ДСП
Древесно-стружечная плита???
...
Рейтинг: 0 / 0
13.07.2018, 14:09
    #39673730
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
Чародей УченикаКомпилятор создаёт ассоциативный массив имён перечисления и прячет в отладочной информации, а отладчик как-то его находит и берёт из него? Если так, то как он его находит?

Очевидно, знает, где искать. Поищи описание отладочной информации, тоже будешь знать.
...
Рейтинг: 0 / 0
13.07.2018, 19:24
    #39673884
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
white_niggerЧародей УченикаНо если я сделаю так:
Код: pascal
1.
2.
3.
4.
5.
  EMyEnum = (
    MyEnumA = 0,
    MyEnumB = 15,
    MyEnumC = 30
  );


То код перестаёт компилироваться с ошибкой:Дырявые енумы не имеют TypeInfo
Попахивает скерее дырявым TypeInfo и не полным RTTI.
...
Рейтинг: 0 / 0
16.07.2018, 10:43
    #39674406
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
Dimonka,

интересно, а как оно в других языках, например C#?
Там есть TypeInfo, и такие "дырявые" множества?
...
Рейтинг: 0 / 0
16.07.2018, 14:29
    #39674510
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
Мне кажется, это чисто паскалевская упрощалка-удобняшка типа массивов с регулируемым началом диапазона индекса, из-за которой в итоге больше проблем, нежели пользы
...
Рейтинг: 0 / 0
16.07.2018, 15:53
    #39674565
Гирлионайльдо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отладчик получает текстовое представление элементов множества?
Код: plaintext
1.
enum Suit { Diamonds = 5, Hearts, Clubs = 4, Spades };  




Да.. Какая дикость
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как отладчик получает текстовое представление элементов множества? / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]