Имена констант и перечислений при отладке

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Имена констант и перечислений при отладке

Сообщение ger_kar » 27.11.2013 (Ср) 17:59

Я тут обдумываю один наболевший вопрос.
Как правило в библиотеках типов, помимо всего прочего, содержатся объявления множества констант и перечислений. Все замечательно, пока дело не доходит до отладки. И вот тут...
При выводе отладочной информации, выводятся не имена констант, а их значения, что естественно.
И приходится делать либо сопоставление вручную, что долго, либо писать отдельные отладочные функции для каждого случая с преобразованием значений в соответствующие строки. И это тоже скажем так не очень продуктивно.
Так вот, хотелось бы узнать, а есть ли универсальный способ получать из TLB эти самые наименования и не париться по каждому случаю. Написать один раз отладочную универсальную функцию и забыть про былой кошмар?
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Имена констант и перечислений при отладке

Сообщение Хакер » 28.11.2013 (Чт) 20:22

А вот, кстати, в джаве, на которой мне довелось вчера писать,
Код: Выделить всё
MyEnum1 foo = MyEnumConst1;
String bar = "mu ha ha ";

System.out.println(bar + foo);

даст именно mu ha ha MyEnumConst1

Что касается VB, то у меня у самого была такая идея. Наименования получать не составляет никакого труда, но придётся в это универсальную функцию передавать, какой enum имеется в виду. Плюс, да, придётся за собой таскать TLB.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Имена констант и перечислений при отладке

Сообщение ger_kar » 29.11.2013 (Пт) 7:09

Ну VB это не джава, тут все посложней будет.
Хакер писал(а):Наименования получать не составляет никакого труда, но придётся в это универсальную функцию передавать, какой enum имеется в виду.
В этом случае ITypeInfo нужно использовать? И далее получать по имени энума все члены и делать сопоставление имени и значения? Т.е. использовать перебор и сравнение?
А без передачи имнени энума никак не обойтись? Или в некоторых случая это все-таки возможно? Я конечно понимаю, что все наименования превращаются в значения на этапе компиляции и увы... , но как правило все эти константы и перечисления являются аргументами соответствующих методов, либо их возвращаемыми значениями. Если известно, что например некоторое перечисление используется в методе X, то ведь можно извлечь и тип (наименование типа)? Или все таки нет?
Бороться и искать, найти и перепрятать

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Имена констант и перечислений при отладке

Сообщение alibek » 29.11.2013 (Пт) 8:42

Код: Выделить всё
Public Enum Numbers
  One = 1
  Two = 2
  Last = 2
End Enum
? PrintEnumNamedValue(Last)

Public Enum Flags
  Flag1 = 1
  Flag2 = 2
  Flag3 = 4
End Enum
? PrintEnumNamedValue(Flag2 Or Flag3)
Lasciate ogni speranza, voi ch'entrate.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.11.2013 (Пт) 10:33

Хакер писал(а):А вот, кстати, в джаве, на которой мне довелось вчера писать,

В .NET'е тоже ;) Особенно в C#. В VB.NET обработка операторов другая и по умолчанию enum'ы приводятся к числу, а не к строке, но можно явно вызвать ToString и будет имя.
alibek, если интересно, то для твоих примеров .NET выдаёт Two и 6.

PS: Хакер, не говори что это оффтопик, джава ведь тоже ;)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Имена констант и перечислений при отладке

Сообщение Хакер » 29.11.2013 (Пт) 10:36

Qwertiy писал(а):В .NET'е тоже ;)
...
PS: Хакер, не говори что это оффтопик, джава ведь тоже ;)

Как ожидаемо. Готов был поставить кучу денег ещё до написания поста, что именно ты именно это напишешь.

Я про джаву написал, потому что мы с топикстартером её долго обсуждали непосредственно перед тем, как он создал тему.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.11.2013 (Пт) 12:15

Хакер писал(а):Я про джаву написал, потому что мы с топикстартером её долго обсуждали непосредственно перед тем, как он создал тему.

Ну я же не знаю, что вы там обсуждаете между собой.

Хакер писал(а):Как ожидаемо. Готов был поставить кучу денег ещё до написания поста, что именно ты именно это напишешь.

Если бы ты про джаву не написал, я бы промолчал ;)
Как и сделал вчера, когда твоего ответа ещё не было.
А вообще я джаву не люблю...

Хакер писал(а):Плюс, да, придётся за собой таскать TLB.

А если написать дополнение к среде для просмотра enum'ов, а не что-то, что можно использовать в рантайме?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Имена констант и перечислений при отладке

Сообщение ger_kar » 29.11.2013 (Пт) 14:20

Qwertiy писал(а):alibek, если интересно, то для твоих примеров .NET выдаёт Two и 6.
Видимо это был пример исключительно для VB.net. Или я может чего то не понимаю, но применительно к VB6 данный пример не применим, а если применим, то тогда, что есть PrintEnumNamedValue? Я так и не въехал.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.11.2013 (Пт) 14:30

ger_kar, это был пример для VB6. B c тем же успехом его сожно трактовать для любого другого языка (VB.NET, Си++ и т. д.).
Фактически там подразумевался вопрос: "А что если трактовка данного значения в данном enum'е неоднозначна, либо точного соответствия значению нет?" и приведены два примера, в которых такие ситуации возникают.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Имена констант и перечислений при отладке

Сообщение ger_kar » 29.11.2013 (Пт) 16:57

Qwertiy писал(а):ger_kar, это был пример для VB6. B c тем же успехом его можно трактовать для любого другого языка (VB.NET, Си++ и т. д.).
Теперь понятно. Примеры были чисто гипотетическими. Однако, если на них внимательно посмотреть и подумать, то в этих ситуациях нет ничего не разрешимого. Причем если брать первый пример, то гипотетически конечно такие перечисления совпадать могут, на практике вряд ли, ибо особого смысла в этом нет. Я еще например такого нигде не встречал. Но даже и эта ситуация не является не разрешимой. Достаточно вывести через запятую все имена с таким значением:
Код: Выделить всё
Public Enum Numbers
  One = 1
  Two = 2
  Last = 2
End Enum
? PrintEnumNamedValue(Last)
Two, Last

Со вторым случаем все немного сложнее, но только немного. Во первых такие случаи встречаются на каждом шагу, и как правило значения таких констант или перечислений отождествляется с определенными битами. Поэтому если при проходе точного соответствия не будет найдено, то можно применив битовые операции выявить все составляющие и вывести в виде (для второго примера): Flag2 + Flag3
Ну и последнее.
Большое спасибо за этот пример, ибо теперь при реализации буду учитывать такие случаи, особенно второй, в силу его распространенности.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.11.2013 (Пт) 17:03

ger_kar писал(а):Я еще например такого нигде не встречал.

Правда? vbOk, vbApplicationModal, vbDefaultButton1 - не помню, чем именно они являются, но всё-таки по логике использования вполне подходят на кандидатов в один enum.
Ну и я сам где-то использовал равные значения.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Имена констант и перечислений при отладке

Сообщение ger_kar » 29.11.2013 (Пт) 17:15

Qwertiy писал(а):Правда?
Правда, правда ;) . Приведенные vbOk, vbApplicationModal, vbDefaultButton1 относятся к совершенно разным энумам и даже примерно не создают никакой не однозначности.
Бороться и искать, найти и перепрятать

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Имена констант и перечислений при отладке

Сообщение alibek » 30.11.2013 (Сб) 9:58

Ну посмотри например у метода ADODB.Connection.Execute аргумент Options.
Или константы WinAPI для международных стандартов.
Lasciate ogni speranza, voi ch'entrate.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.11.2013 (Сб) 12:00

ger_kar писал(а):Приведенные vbOk, vbApplicationModal, vbDefaultButton1 относятся к совершенно разным энумам

Тогда ещё более интересно, как ты хочешь увидеть их объединение, переданное в MsgBox. Тем более, что они все равны 0.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Имена констант и перечислений при отладке

Сообщение ger_kar » 30.11.2013 (Сб) 12:12

alibek писал(а):Ну посмотри например у метода ADODB.Connection.Execute аргумент Options.
Это член ExecuteOptionEnum имеется ввиду? Если да, то к нему как раз подходит второй пример. Для таких энумов достаточно сделать Value And [member] и если результат True, то включить этот член в выходную строку.
Qwertiy писал(а):Тогда ещё более интересно, как ты хочешь увидеть их объединение, переданное в MsgBox. Тем более, что они все равны 0.
А вот тут засада :).
Бороться и искать, найти и перепрятать


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot], SemrushBot и гости: 42

    TopList