Как вызвать виртуальную функции по ее индексу...
От: Oval  
Дата: 02.04.03 01:44
Оценка:
...в таблице виртуальных функций?
Re: Как вызвать виртуальную функции по ее индексу...
От: IT Россия linq2db.com
Дата: 02.04.03 02:55
Оценка:
Здравствуйте, Oval, Вы писали:

O>...в таблице виртуальных функций?


Это же грубый хак. Что нужно сделать, может другим способом обойдёмся?
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Как вызвать виртуальную функции по ее индексу...
От: Oval  
Дата: 02.04.03 03:15
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Oval, Вы писали:


O>>...в таблице виртуальных функций?


IT>Это же грубый хак. Что нужно сделать, может другим способом обойдёмся?

Точно, он самый! Но нужна таблица указателей на функции в количестве > 200 штук, и самому понятно ее иннициализировать неохота, вот и хочется переложить эту работу на компилятор
Re[3]: Как вызвать виртуальную функции по ее индексу...
От: IT Россия linq2db.com
Дата: 02.04.03 05:03
Оценка:
Здравствуйте, Oval, Вы писали:

IT>>Это же грубый хак. Что нужно сделать, может другим способом обойдёмся?


O>Точно, он самый! Но нужна таблица указателей на функции в количестве > 200 штук, и самому понятно ее иннициализировать неохота, вот и хочется переложить эту работу на компилятор


Можно какие-нибудь макросы зарядить для этого дела, ну уж только не хаком иннициализировать
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Как вызвать виртуальную функции по ее индексу...
От: Аноним  
Дата: 02.04.03 05:08
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Oval, Вы писали:


IT>>>Это же грубый хак. Что нужно сделать, может другим способом обойдёмся?


O>>Точно, он самый! Но нужна таблица указателей на функции в количестве > 200 штук, и самому понятно ее иннициализировать неохота, вот и хочется переложить эту работу на компилятор


IT>Можно какие-нибудь макросы зарядить для этого дела, ну уж только не хаком иннициализировать

Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.
Re[5]: Как вызвать виртуальную функции по ее индексу...
От: IT Россия linq2db.com
Дата: 02.04.03 05:12
Оценка:
Здравствуйте, Аноним, Вы писали:

IT>>Можно какие-нибудь макросы зарядить для этого дела, ну уж только не хаком иннициализировать


А>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.


А если это интерфейс, то зачем так извращаться?
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Как вызвать виртуальную функции по ее индексу...
От: Аноним  
Дата: 02.04.03 05:32
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Аноним, Вы писали:


IT>>>Можно какие-нибудь макросы зарядить для этого дела, ну уж только не хаком иннициализировать


А>>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.


IT>А если это интерфейс, то зачем так извращаться?

Гибкий MIDI парсинг
Re[7]: Как вызвать виртуальную функции по ее индексу...
От: IT Россия linq2db.com
Дата: 02.04.03 05:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.


IT>>А если это интерфейс, то зачем так извращаться?


А>Гибкий MIDI парсинг


Ну смотри, потом не говори, что я тебя не предупреждал

class CHack
{
public:
    virtual void __cdecl A() { printf("A\n"); }
    virtual void __cdecl B() { printf("B\n"); }
    virtual void __cdecl C() { printf("C\n"); }
};

void main()
{
    CHack h;

    void (__cdecl ** pf)(CHack*) = (void (__cdecl **)(CHack*))(*(void**)&h);

    for (int i = 0; i < 3; i++)
        pf[i](&h);

    h.A();
    h.B();
    h.C();
}
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: Как вызвать виртуальную функции по ее индексу...
От: Аноним  
Дата: 02.04.03 08:40
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Аноним, Вы писали:


А>>>>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.


IT>>>А если это интерфейс, то зачем так извращаться?


А>>Гибкий MIDI парсинг


Вообще-то есть такая вещь, как указатель на виртуальную функцию. Который, в частности, хранит индекс в таблице (sizeof, соответственно, больше sizeof указателя на обычную функцию). И кроме того, он правильно обрабатывает виртуальное наследование.
Re[9]: Как вызвать виртуальную функции по ее индексу...
От: Vamp Россия  
Дата: 02.04.03 09:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вообще-то есть такая вещь, как указатель на виртуальную функцию. Который, в частности, хранит индекс в таблице (sizeof, соответственно, больше sizeof указателя на обычную функцию). И кроме того, он правильно обрабатывает виртуальное наследование.


А МОЖНО ПРО ЭТО ПОДРОБНЕЕ??? Что-то я еще никогда не слышал об указателях, размер которых изменяется... Как-то я был уверен, что все они (на интел-платформе, во всяком случае) равны размеру регистра...
Да здравствует мыло душистое и веревка пушистая.
Re[10]: Как вызвать виртуаьную функции по ее инексу...
От: Павел Кузнецов  
Дата: 02.04.03 09:16
Оценка:
Здравствуйте, Vamp, Вы писали:

А>> указатель на виртуальную функцию. Который, в частности, хранит индекс

А>> в таблице (sizeof, соответственно, больше sizeof указателя на обычную функцию).

V> А МОЖНО ПРО ЭТО ПОДРОБНЕЕ??? Что-то я еще никогда не слышал об

V> указателях, размер которых изменяется... Как-то я был уверен, что все
V> они (на интел-платформе, во всяком случае) равны размеру регистра...

Указатель не то же, что адрес. В частности, указатель на функцию-член
далеко не обязательно содержит ее адрес. Часто, как и указал Vamp,
указатели на члены содержат некие индексы, по которым компилятор
может впоследствии определить, какую же функцию-член нужно вызывать.
Читать или искать в данном форуме "Указатели на члены".
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[10]: Как вызвать виртуальную функции по ее индексу...
От: Lorenzo_LAMAS  
Дата: 02.04.03 09:17
Оценка:
Тут был пример как-то:
struct A;
typedef void (A::*PF)();
struct A{};
int main()
{
   std::cout<<sizeof(PF)<<std::endl;   

   return 0;
}

Если не ошибаюсь, то так
Of course, the code must be complete enough to compile and link.
Re[8]: Как вызвать виртуальную функции по ее индексу...
От: Oval  
Дата: 02.04.03 10:04
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Аноним, Вы писали:


А>>>>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.


IT>>>А если это интерфейс, то зачем так извращаться?


А>>Гибкий MIDI парсинг


IT>Ну смотри, потом не говори, что я тебя не предупреждал


IT>
IT>class CHack
IT>{
IT>public:
IT>    virtual void __cdecl A() { printf("A\n"); }
IT>    virtual void __cdecl B() { printf("B\n"); }
IT>    virtual void __cdecl C() { printf("C\n"); }
IT>};

IT>void main()
IT>{
IT>    CHack h;

IT>    void (__cdecl ** pf)(CHack*) = (void (__cdecl **)(CHack*))(*(void**)&h);

IT>    for (int i = 0; i < 3; i++)
IT>        pf[i](&h);

IT>    h.A();
IT>    h.B();
IT>    h.C();
IT>}
IT>

Вот спасибо-то!
Re[9]: Как вызвать виртуальную функции по ее индексу...
От: Oval  
Дата: 03.04.03 02:03
Оценка:
Здравствуйте, Oval, Вы писали:

O>Здравствуйте, IT, Вы писали:


IT>>Здравствуйте, Аноним, Вы писали:


А>>>>>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.


IT>>>>А если это интерфейс, то зачем так извращаться?


А>>>Гибкий MIDI парсинг


IT>>Ну смотри, потом не говори, что я тебя не предупреждал


IT>>
IT>>class CHack
IT>>{
IT>>public:
IT>>    virtual void __cdecl A() { printf("A\n"); }
IT>>    virtual void __cdecl B() { printf("B\n"); }
IT>>    virtual void __cdecl C() { printf("C\n"); }
IT>>};

IT>>void main()
IT>>{
IT>>    CHack h;

IT>>    void (__cdecl ** pf)(CHack*) = (void (__cdecl **)(CHack*))(*(void**)&h);

IT>>    for (int i = 0; i < 3; i++)
IT>>        pf[i](&h);

IT>>    h.A();
IT>>    h.B();
IT>>    h.C();
IT>>}
IT>>

O>Вот спасибо-то!
У меня почему-то это не работает, зато работает следующий код:
typedef void (MyClass::*PF)();

union {
PF f;
int i[2];
};
int[0] = необходимый индекс функции + 2;
int[1] = 0;
MyClass* p = &myObject;
(myObject->*f)();
Но все равно спасибо.
Re[10]: Как вызвать виртуальную функции по ее индексу...
От: IT Россия linq2db.com
Дата: 03.04.03 02:28
Оценка:
Здравствуйте, Oval, Вы писали:

O>У меня почему-то это не работает, зато работает следующий код:


Потому что нужно подбирать соглашение о вызовах, которое зависит от версии и настроек компилятора.

O>typedef void (MyClass::*PF)();


Здесь компилятор уже сам заботится о соглашениях о вызовах. Так пожалуй будет лучше, хотя это всё равно хак, грязный хак
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: Как вызвать виртуальную функции по ее индексу...
От: Oval  
Дата: 03.04.03 03:07
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Oval, Вы писали:


O>>У меня почему-то это не работает, зато работает следующий код:


IT>Потому что нужно подбирать соглашение о вызовах, которое зависит от версии и настроек компилятора.


O>>typedef void (MyClass::*PF)();


IT>Здесь компилятор уже сам заботится о соглашениях о вызовах. Так пожалуй будет лучше, хотя это всё равно хак, грязный хак

Но он работает! Все-равно я скрою эти вызовывы в private части библиотечного класса.
Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?
Re[12]: Как вызвать виртуальную функции по ее индексу...
От: IT Россия linq2db.com
Дата: 03.04.03 03:18
Оценка:
Здравствуйте, Oval, Вы писали:

O>Но он работает! Все-равно я скрою эти вызовывы в private части библиотечного класса.


Всё равно существует потенциальная зависимость от версий компиляторов.

O>Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?


По идее не должно быть проблем, но нужно проверить.
Если нам не помогут, то мы тоже никого не пощадим.
Re[13]: Как вызвать виртуальную функции по ее индексу...
От: Oval  
Дата: 03.04.03 04:04
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Oval, Вы писали:


O>>Но он работает! Все-равно я скрою эти вызовывы в private части библиотечного класса.


IT>Всё равно существует потенциальная зависимость от версий компиляторов.

Будет непереносимая библиотека для конкретного устройства и компилятора.

O>>Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?


IT>По идее не должно быть проблем, но нужно проверить.

100% если самый базовый класс не мой и содержит виртуальные функции то необходимо смещение индексов. Естественно не пойми какое(лучше контролировать первичность моего класса в наследовании).
Re[14]: Как вызвать виртуальную функции по ее индексу...
От: IT Россия linq2db.com
Дата: 03.04.03 04:45
Оценка:
Здравствуйте, Oval, Вы писали:

O>>>Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?


IT>>По идее не должно быть проблем, но нужно проверить.


O>100% если самый базовый класс не мой и содержит виртуальные функции то необходимо смещение индексов. Естественно не пойми какое(лучше контролировать первичность моего класса в наследовании).


Ты пробовал или просто так думаешь?
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: Как вызвать виртуальную функции по ее индексу...
От: Oval  
Дата: 29.04.03 14:09
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Oval, Вы писали:


O>>>Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?


IT>>По идее не должно быть проблем, но нужно проверить.


O>100% если самый базовый класс не мой и содержит виртуальные функции то необходимо смещение индексов. Естественно не пойми какое(лучше контролировать первичность моего класса в наследовании).


IT>Ты пробовал или просто так думаешь?

Вообще я так думаю. Ну а как иначе — 1)указатели на виртуальные функции(ненужные) базового класса пойдут наверняка первыми; 2) их количество для вычесления смещения средствами языка имхо не узнать.
Re[16]: Как вызвать виртуальную функции по ее индексу...
От: Oval  
Дата: 29.04.03 17:32
Оценка:
Здравствуйте, Oval, Вы писали:

O>Здравствуйте, IT, Вы писали:


IT>Здравствуйте, Oval, Вы писали:


O>>>Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?


IT>>По идее не должно быть проблем, но нужно проверить.


O>100% если самый базовый класс не мой и содержит виртуальные функции то необходимо смещение индексов. Естественно не пойми какое(лучше контролировать первичность моего класса в наследовании).


IT>Ты пробовал или просто так думаешь?

O>Вообще я так думаю. Ну а как иначе — 1)указатели на виртуальные функции(ненужные) базового класса пойдут наверняка первыми; 2) их количество для вычесления смещения средствами языка имхо не узнать.
Уже в ванной под душем нашел решение — а ведь можно попробовать поискать в ВТ адрес функции-заглушки, которая никогда не будет переопределена и на основе ее найти смещение!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.