Re[7]: Указатель на функцию
От: Shady Россия  
Дата: 21.12.04 23:27
Оценка:
Hello, Irokez!
You wrote on Tue, 21 Dec 2004 23:20:23 GMT:

I> Смешно вы говорите.

I> Трасировал на встроенном дизасемблере вызов функции метода класса. Или я тут один такой умный
I> (не примите как возвышение над вами). неявный указатель this, нужен только для одной вещи, чтобы
I> обратиться к член-данным класса, и ни при чем тут функции.
КОД В СТУДИЮ
Ессесно корректного приведения указателя на метод класса к void*, и без хаков.
Posted via RSDN NNTP Server 1.9 delta
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
Re[3]: Указатель на функцию
От: Irokez  
Дата: 21.12.04 23:44
Оценка: -2 :))) :)))
Здравствуйте, Shady, Вы писали:

К сожалению Я уже написал что тема закрыта. А о том как привести тип спросите у ЭКСПЕРТА, MICROSOFT, или додумайтесь сами.

Кстати что поразительно у меня есть 100% рабочий код приведения метода класса к любому типу, а вторым постом после моего идет ответ что это сделать невозможно, а не вопрос как это сделать. Как говорили у нас в академии учите мат. часть.

Ребята я не гений, и я не кичусь своими знаниями, я не писал приложения Хэлло Ворлд ни разу.
Re[4]: Указатель на функцию
От: Shady Россия  
Дата: 21.12.04 23:49
Оценка: :)
Hello, Irokez!
You wrote on Tue, 21 Dec 2004 23:44:10 GMT:

Ну может всё же для меня напишите? Я то же занимаюсь областью маршалинга и мне очень интересно.
Posted via RSDN NNTP Server 1.9 delta
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
Re[4]: Указатель на функцию
От: korzhik Россия  
Дата: 22.12.04 07:49
Оценка:
Здравствуйте, Irokez, Вы писали:

I>К сожалению Я уже написал что тема закрыта. А о том как привести тип спросите у ЭКСПЕРТА, MICROSOFT, или додумайтесь сами.

I>Ребята я не гений, и я не кичусь своими знаниями, я не писал приложения Хэлло Ворлд ни разу

Неожидал что за ночь тут развернётся такая жаркая дискуссия
Честно говоря удивлён как на ровном месте создалась конфликтная ситуация.
Не понимаю зачем закрывать тему?
Вот демагогию заканчивать надо, а обсуждение технических вопросов предлагаю продолжить.
Вдруг вы заблуждаетесь или мы вас не поняли.


I>Кстати что поразительно у меня есть 100% рабочий код приведения метода класса к любому типу, а вторым постом после моего идет ответ что это сделать невозможно


ну тут всё ясно
простой указатель и указатель на функцию-член суть разные вещи, поэтому в лоб это преобразование сделать невозможно. Возможно это приведение будет работать на какой то платформе в простейшем случае, но в общем случае это сделать нельзя.
Но можно сделать например так:
обернуть указатель на функцию-член в структуру и указатель на её экземпляр уже привести к
void*.
Re: Указатель на функцию
От: Went  
Дата: 22.12.04 08:14
Оценка:
О чем спор? Прежде чем дискутировать, как меня учили, следует опредеиться в терминологии.

Если разобраться, то окажется, что позиция Irokeza отличается от позиции ALL в двух вопросах.

1. Что такое адресс функции-члена?
Irokez — это тот физ. адрес, по которму делается call при вызове функции на уровне машинного кода.
ALL — это семейство типов С++, в соответствии с синтаксисом которого, подставляя адрес объекта и аргументы, получается корректный вызов функции (с учетом виртуальности и множественного / виртуального наследованя)

2. Что таке привдение типов?
Irokez — это насильственное приведение, когда исходное значение и результирующее совпадют только численно (и то не всегда)
ALL — это один из принципов С++, гарнатирующий корректное поведение программы с точки зрения компилятора.

Так вот, исходя из этих терминов, обе стороны по-своему правы .

Это, конечно, мое ИМХО, возможно, я чет недопонял.
Re[2]: Указатель на функцию
От: Irokez  
Дата: 22.12.04 08:22
Оценка:
Здравствуйте, Went, Вы писали:

Полностью поддерживаю высказываение.

Но, с точки зрения синтаксиса в моем коде я не выхожу за пределы стандартных С++ преобразований.
Re[3]: Указатель на функцию
От: Went  
Дата: 22.12.04 08:27
Оценка:
Здравствуйте, Irokez, Вы писали:

I>Но, с точки зрения синтаксиса в моем коде я не выхожу за пределы стандартных С++ преобразований.


Да нефига ж себе

Тогда что есть выходить за пределы стандартных преобразований
Re[3]: Указатель на функцию
От: Glоbus Украина  
Дата: 22.12.04 08:27
Оценка:
Здравствуйте, Irokez, Вы писали:

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


I>Полностью поддерживаю высказываение.


I>Но, с точки зрения синтаксиса в моем коде я не выхожу за пределы стандартных С++ преобразований.


Покажи как?
Удачи тебе, браток!
Re: Указатель на функцию
От: А.Якубовский  
Дата: 22.12.04 08:41
Оценка: -3 :)
class A {
public:
 void __stdcall F1(int k)
 {
   printf("A::F1(%d)\n",k);
 }
};


и есть второй класс

class B: public A {
public:
 void __stdcall F1(int k,int d)
 {
   printf("B::F1(%d,%d)\n",k,d);
 }
};


теперь внимание ответ.
struct Method {
 void*        mthdOwner;
 void*    mthdFunction;
 Method(void* Owner,...)
 {
  va_list mthd;
  va_start(mthd,Owner);
  mthdOwner    = Owner;
  mthdFunction    = va_arg(mthd,void*);
  va_end(mthd);
 }
};

Ну и где то в коде 

B b;
Method m(&b,B::F1);


И теперь пусть хоть кто-то скажет что нельзя привести указатель на функцию к типу войд*, или другому типу
Re[2]: Указатель на функцию
От: Аноним  
Дата: 22.12.04 08:50
Оценка: :)
Идея понятна.
Создается промежуточный объект, который хранит пару (объект, адрес метода).
Затем адрес на объект преобразуется в void*
Это в общем стандратное и нормальное решение.

Правда реализовать это можно куда элегантнее и красивее
и в итоге получишь некий аналог известного из boost'а

Но это ведь не то же самое, о чем говорил Ирокез.
Хотя хрен его знает, о чем он говорил.
Его кода никто пока не видел.
Re[3]: Указатель на функцию
От: А.Якубовский  
Дата: 22.12.04 08:52
Оценка:
Здравствуйте, Аноним, Вы писали:
Это и есть Ирокез, я просто сменил имя
Re[2]: Указатель на функцию
От: Glоbus Украина  
Дата: 22.12.04 08:53
Оценка:
Здравствуйте, А.Якубовский, Вы писали:

АЯ>теперь внимание ответ.

АЯ>
АЯ>struct Method {
АЯ> void*        mthdOwner;
АЯ> void*    mthdFunction;
АЯ> Method(void* Owner,...)
АЯ> {
АЯ>  va_list mthd;
АЯ>  va_start(mthd,Owner);
АЯ>  mthdOwner    = Owner;
АЯ>  mthdFunction    = va_arg(mthd,void*);
АЯ>  va_end(mthd);
АЯ> }
АЯ>};

АЯ>Ну и где то в коде 

АЯ>B b;
АЯ>Method m(&b,B::F1);

АЯ>


АЯ>И теперь пусть хоть кто-то скажет что нельзя привести указатель на функцию к типу войд*, или другому типу


Ээээ..
1) А как теперь пользотвать этот класс мэтода?
2) Что случится если sizeof(void*) < sizeof(void A::*) ?
Удачи тебе, браток!
Re[2]: Указатель на функцию
От: Вадим Никулин Россия Здесь
Дата: 22.12.04 08:56
Оценка: +1
Здравствуйте, А.Якубовский, Вы писали:

АЯ>И теперь пусть хоть кто-то скажет что нельзя привести указатель на функцию к типу войд*, или другому типу


Ну ты представляешь! Все-равно нельзя! Слабо в след. примере вызвать твоим способом A::Func для объекта d?
#include <iostream>

class A
{
   int a;
   public:
      void Func()
           {
           }
};

class B : virtual public A
{
   int b;
};

class C : virtual public A
{
   int c;
};

class F
{
   int f;
};

class D : public F, public B, public C
{
};

int main()
{
   void (A::*func)() = &A::Func;
   D d;
   (d.*func)();
   return 0;
}
Re[3]: Указатель на функцию
От: А.Якубовский  
Дата: 22.12.04 08:57
Оценка: :))) :))
Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, А.Якубовский, Вы писали:


G>Ээээ..

G>1) А как теперь пользотвать этот класс мэтода?
G>2) Что случится если sizeof(void*) < sizeof(void A::*) ?

Во первых никогда не встречал чтоб указатель на 32-битной платформе был больше 32
А вам блин еще и подай как маршалинг у меня реализован на основе этого кода. Я блин парился всю ночь, по дружные издевки, а потом дайте мне плз. реализацию маршалинга. Ребята не по взрослому получается.
Re: Указатель на функцию
От: jazzer Россия Skype: enerjazzer
Дата: 22.12.04 08:59
Оценка:
Здравствуйте, Irokez, Вы писали:

Боюсь, что мы сейчас увидим решение с ..., thunks в стиле ATL или еще что-нть непереносимое.

Irokez, один вопрос — твое решение переносимо?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Указатель на функцию
От: ssm Россия  
Дата: 22.12.04 09:00
Оценка:
Здравствуйте, А.Якубовский, Вы писали:

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

АЯ>Это и есть Ирокез, я просто сменил имя

что скажешь теперь?

class A
{
};

class B: virtual public A {
public:
    void __stdcall F1(int k,int d){}
};


int main()
{
    B b;
    Method m(&b,B::F1);


    printf("%i", sizeof (&B::F1));
}
Re[3]: Указатель на функцию
От: Вадим Никулин Россия Здесь
Дата: 22.12.04 09:00
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:

ВН>Ну ты представляешь! Все-равно нельзя! Слабо в след. примере вызвать твоим способом A::Func для объекта d?


Кстати, заметь, Func в этом примере даже не виртуальная. А если бы была виртуальная, то вообще беда.
Re[2]: Указатель на функцию
От: Кодт Россия  
Дата: 22.12.04 09:02
Оценка: +1
Здравствуйте, А.Якубовский, Вы писали:

АЯ>теперь внимание ответ.

АЯ>И теперь пусть хоть кто-то скажет что нельзя привести указатель на функцию к типу войд*, или другому типу

Да вот я скажу, что нельзя. Хочешь? На:
#include <iostream>
using namespace std;

struct A
{
};

struct B : virtual A
{
  virtual void foo() {}
};

int main()
{
  cout << "size of void*   = " << sizeof(void*  ) << endl;
  cout << "size of &B::foo = " << sizeof(&B::foo) << endl;
}
Перекуём баги на фичи!
Re[2]: Указатель на функцию
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.12.04 09:03
Оценка: +2
Этот код будет работать в предположении, что sizeof(void *) == sizeof( void (some_class::*)() ).

Простая программа для проверки:

#include <iostream>

class    A
  {
  public :
    void f() {}
  };

typedef void (A::*meth_ptr_t)();

int
main()
  {
    void * vp = 0;
    meth_ptr_t mp = 0;

    std::cout << "sizeof(vp): " << sizeof(vp) << ", "
      << "sizeof(mp): " << sizeof(mp) << std::endl;

    return 0;
  }


Результат работы под VC++ 7.1:
sizeof(vp): 4, sizeof(mp): 4

Под Borland C++ 5.6:
sizeof(vp): 4, sizeof(mp): 12

Под GNU C++ 3.3.3 (cygwin):
sizeof(vp): 4, sizeof(mp): 8

И это только i386 архитектура...

Получается, что это одно из тех решений, из-за которых C/C++ приобретает плохую репутацию.

P.S. Программирую на C++ с 1992 г. Такую распальцовку видел впервые.





SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: Указатель на функцию
От: LaptevVV Россия  
Дата: 22.12.04 09:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Это невозможно.


А>Но boost::bind и boost::function помогут

А>тебе решить твою задачу.


А>P.S. Популярный это однако вопрос, о том как указатель на метод

А>класса преобразовать в void* .
А>Пару раз за неделю он тут возникает
Значит пора Q&A написать... Кто напишет?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.