435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||||||
1 | ||||||
Просмотр адреса метода11.11.2014, 08:22. Показов 2320. Ответов 21
Метки нет (Все метки)
В процессе отладки возникла необходимость узнать адрес метода класса. Как это сделать? Т.е. как узнать чему равна Func в примере ниже?
0
|
11.11.2014, 08:22 | |
Ответы с готовыми решениями:
21
Просмотр тела метода CS0029 при присвоении переменной адреса метода Различия в выводе адреса метода класса через printf() и cout Меняют ли элементы в vector свои адреса при вызове метода push_back? |
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
|
||||||
11.11.2014, 09:20 | 2 | |||||
1
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
11.11.2014, 10:22 [ТС] | 3 |
Нет. Мне нужен указатель на метод, а ваш вариант это указатель на указатель на метод.
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|||||||||||
11.11.2014, 10:51 | 4 | ||||||||||
Ну так разыменуйте указатель на указатель:
1
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
11.11.2014, 15:13 [ТС] | 6 |
Пробовал напрямую привести к void* и к int, но компилятор не дал, не понимаю почему.
Ошибся вместо Func добавил в WatchList *Func, он естесвенно ничего не показал. Я так привык, что WatchList не показывает переменные что я даже не удивился и не заподозрил неладное. Вы же естественно понимаете, что метод это ф-ция со скрытым параметром. И адрес метода (как и любой другой адрес) это все таки 1 число, а второе число это адрес экземпляра класса.
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
11.11.2014, 15:21 | 7 |
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||||||
11.11.2014, 15:39 [ТС] | 8 | |||||
0
|
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
|
|
11.11.2014, 18:01 | 9 |
gumi250, обьясни, пожалуйста, что именно ты хочешь сделать, как и где обьявлена функция в классе и еще вот по теме.
Про __closure почти ничего нет, но много чего интересного
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||||||
12.11.2014, 02:10 [ТС] | 10 | |||||
Есть компонент, скажем Button. У него событие OnMouseDown. Я динамически присваиваю OnMouseDown то один, то другой обработчик. И в какой то момент мне захотелось узнать какой из обработчиков установлен.
А вообще, т.к. WatchList не показывает все переменные, то я давно использую логирование. В очень сильно упрощенном варианте выглядет это примерно так:
0
|
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
|
|
12.11.2014, 02:25 | 11 |
WatchList показывает все переменные, которые находятся в области видимости ....
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
12.11.2014, 02:35 [ТС] | 12 |
0
|
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
|
|
12.11.2014, 02:41 | 13 |
gumi250, ты написал в "упрощенном варианте". Скажи как надо, а то void PrintM(int a) и "его друзья" не очень вяжутся с OnMouseDown.
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
12.11.2014, 03:03 [ТС] | 14 |
С OnMouseDown я уже решил и адрес на метод с шаманством переименования посмотрел.
Про логер (код с PrintM) это как бы вдогонку (т.к. был помянут WatchList). Т.е. все адреса на переменные и ф-ции компилятор легко приводит к void*, т.е. для них всегда вызываетя PrintM(void*). А вот написать функцию PrintM(void (__closure *Func)(void)) которая бы всегда вызывалась для любого указателя на метод класса, увы, я так понимаю, не получится. Поэтому придется писать некрасиво PrintM(*(int*)&Func1);
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
12.11.2014, 08:23 | 15 |
Я просто не обратил внимания на __closure. Если убрать __closure, то это будет не метод, а функция с одним единственным адресом.
Кстати, в дебаггере я смотрел адреса функций без Watch List'а; просто наводил указатель мыши на указатель на функцию, и во всплывающей подксказке отображалась нужная информация. Так работает дебаггер в BCB6. Сомневаюсь. что в более современных IDE ситуация с этим хуже.
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
12.11.2014, 08:30 [ТС] | 16 |
Вроде раньше всплывала чего то, но я этим никогда не пользовался. Сейчас не всплывает, наверняка какую-нить галочку снял.
0
|
12.11.2014, 09:16 | 17 | ||||||||||
Все получится, если надо будет. Хотя, на мой взгляд, логирование оправдано разве что на отладке потоков и естественно без всяких ShowMessage()... остальное в отладчике посмотреть можно... ну, дык, каждый сам себе голова, так что черт с этим...
Вот пример синтаксиса номер раз: Загрузка картинки в динамический TImage через поток А вот номер двас, без всяких __closure:
Дернул со старого проекта, так что на дизайн кода прошу внимания не обращать...
1
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||||||
12.11.2014, 11:19 [ТС] | 18 | |||||
BRcr, Ваши примеры я чесно говоря не понял, но они навели меня на мысль, может это вы и имели в виду.
Вообщем вот так вроде работает:
Не знаю, в каком отладчике можно все посмотреть, но у меня WatchList зачастую переменные не показывает и приходится их в логер выводить. Если в WatchList добавить штук 20 переменных, то пошаговая отладка начинает притормаживать. Конечно каждому свое, лично я без логера не могу.
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
12.11.2014, 11:30 [ТС] | 20 |
BRcr, еще вопрос. У вас WatchList всегда показывает любые переменные которые вам нужны? Если он их не показывает что вы тогда делаете?
0
|
12.11.2014, 11:30 | |
12.11.2014, 11:30 | |
Помогаю со студенческими работами здесь
20
Невозможно передать ArrayList в аргументы метода без модификатора static у этого метода или метода main Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода Как достать из телефонной книги адреса чатов, адреса проживания и сайты Почему при присваивании адреса массива не ставится знак '&' получения адреса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |