Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трюк, возможно ли это? 
:(
    Опции темы
vaddsm
Дата 7.9.2008, 17:37 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Цитата

ты используешь указатель на метод класса, при чем там this я не в курсе


БОГ МОЙ! Гуру c++! Как по вашему указатель на метод класса соотносится с экземпляром класса, такой указатель как минимум должен содержать this и адрес самого метода в памяти. 

Цитата

ты что-то путаешь
в коде который ты привел


Еще раз, указатель на метод класса, как минимум 8 байт, он может быть и 12 и 16 байт. Одно остается неизменным, то, что, такая вот конструкция  *(DWORD *)&lpfun, вернет нам только, 4 байта - адрес самого метода, в случае если метод объявлен void, vod __fastcall, void __stdcall и тд и тп. 

С 64x разрядными системами я не работал, по этому демогогии не будет, хотя и для этого случая можно предусмотреть отдельный дефайн.

Цитата

попробуй собрать и запустить свой код под em64t


Так надо, говорю же, дефайн в крайнем случае добавить один, а так в принципе, можно и в этой форме попробывать.

 
PM MAIL   Вверх
Lazin
Дата 7.9.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Код

template < 
    class UserClass, 
    void (UserClass::*Delegate)() = &UserClass::operator()
>
class tool_table_wrapper : public UserClass
{
public:
    tool_table_wrapper()
    {
        (static_cast<UserClass*>(this)->*Delegate)();//вызов пользовательского метода
    }
};

class AnyClass
{
public:
    AnyClass()
    {
        std::cout << "AnyClass ctor" << std::endl;
    }
    void do_some_staff()
    {
        std::cout << "do some staff" << std::endl;
    }
    void operator () ()
    {
        std::cout << "operator ()" << std::endl;
    }
};

typename tool_table_wrapper<AnyClass, &AnyClass::do_some_staff> TAnyClass;//вызываем ф-ю do_some_staff
typename tool_table_wrapper<AnyClass> TAnyClass2;//используется параметр по умолчанию

TAnyClass* inst = new TAnyClass();
TAnyClass2* inst2 = new TAnyClass2();

этот код выведет:
Цитата

AnyClass ctor
do some staff
AnyClass ctor
operator ()


как видишь можно вызвать любой код, и это не сломается при переносе на другую платформу

Это сообщение отредактировал(а) Lazin - 8.9.2008, 09:38
PM MAIL Skype GTalk   Вверх
vaddsm
Дата 7.9.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Цитата

я отвечу.


Эта фраза (уволили) относилась к другому коду, не к последней реализации. 

А из конструктивного хочу знать, где именно зависимость от компилятора (BCB - VS)? У кого VS под рукой, проверьте!



Это сообщение отредактировал(а) vaddsm - 7.9.2008, 17:43
PM MAIL   Вверх
Lazin
Дата 7.9.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(vaddsm @  7.9.2008,  17:37 Найти цитируемый пост)
Как по вашему указатель на метод класса соотносится с экземпляром класса, такой указатель как минимум должен содержать this и адрес самого метода в памяти. 

то что ты описал относится не к указателю на метод, а к указателю на метод с модификатором __closure, тоесть это работает только с BCB
для всех остальных компиляторов указатель на метод, это указатель на функцию, никакого this там не будет
PM MAIL Skype GTalk   Вверх
vinter
Дата 7.9.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



__fastcall


--------------------
Мой блог
PM MAIL WWW   Вверх
vaddsm
Дата 7.9.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Цитата

1. Куча макросов, код тяжело читать.


Макросы, тотже код, читать тяжело с непривычке. Так, что это субъективно.

Цитата

2. Код -  костыль, не то что палтформо - а компиляторо зависим.


Тут я жду как он себя на VS проявит, пока нет под рукой этого компилятора. Будет результат, тогда и поговорим.

Цитата

3. Мне сходу не понятно, что делает втой код, и не факт что я бы быстро вьехал, если бы не знал. Это показатель, для меня.


Тут я стобой и спорить не буду, для меня тоже показатель. Но в данном случае код достаточно снабдить и комментом.

Добавлено @ 17:51
Сейчас с VS разберемся.

Добавлено @ 17:54
Lazin, тот код что ты привел, он какое отношение к задаче имеет? Я уже устал повторять, задача не в том чтобы с делигатами работать было удобно. Задача сделать удобный интерфейс для библиотеки, в той форме, в которой я изначально показал.

Добавлено @ 17:56
ПОГОДИТЕ! а что VS не поддерживает конвенцию __fastcall???? Если поддерживает, в чем ваши притензии к коду?

Это сообщение отредактировал(а) vaddsm - 7.9.2008, 17:57
PM MAIL   Вверх
Lazin
Дата 7.9.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(vaddsm @  7.9.2008,  17:48 Найти цитируемый пост)
в чем ваши притензии к коду?

в том, что он нерабочий smile 
жаль проверить нечем
PM MAIL Skype GTalk   Вверх
vaddsm
  Дата 7.9.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Lazin, у меня нет большого опыта, работы в VS среде, но ты берешся утверждать, что:

допустим, LPMF_CKINGFUNCTIONPTR - тип заведенный для хранения указателей на функцию член класса вида:

void Function_ofF_RINGTYPE(void);

тогда,  LPMF_CKINGFUNCTIONPTR lpFun = (LPMF_CKINGFUNCTIONPTR)&SomeClass->Function_ofF_RINGTYPE;

после этого lpFun не будет содержать никакой информаци о SomeClass???!

Добавлено @ 18:14
Цитата

в том, что он нерабочий  
жаль проверить нечем


 smile  smile  smile  


У меня он работает при любых интересующих меня условиях, я его писал и проверял.

Ты не проверял, но утверждаешь что он не рабочий. Говорить догмами по моему, это привилегия бога.

 smile Уважаемый, Lazin, прошу вас на практике подтвердить хоть один тезис из всех ваших критикующих постов. Любой!

Меня ооочень интересует конструктивная критика.


Это сообщение отредактировал(а) vaddsm - 7.9.2008, 18:15
PM MAIL   Вверх
vinter
Дата 7.9.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(vaddsm @  7.9.2008,  18:48 Найти цитируемый пост)
а что VS не поддерживает конвенцию __fastcall?

поддерживает, но не так как BCB
Цитата

In Fast Calling Convention (__fastcall), the first two parameters are loaded into ecx, edx registers, respectively.




--------------------
Мой блог
PM MAIL WWW   Вверх
vaddsm
Дата 7.9.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Добрался до VS, сейчас доработаю.

Добавлено через 1 минуту и 7 секунд
Ага, vinter, вот это я и называю конструктивно, спасибо!
PM MAIL   Вверх
Lazin
Дата 7.9.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(vaddsm @  7.9.2008,  18:09 Найти цитируемый пост)
допустим, LPMF_CKINGFUNCTIONPTR - тип заведенный для хранения указателей на функцию член класса вида:

void Function_ofF_RINGTYPE(void);

тогда,  LPMF_CKINGFUNCTIONPTR lpFun = (LPMF_CKINGFUNCTIONPTR)&SomeClass->Function_ofF_RINGTYPE;

после этого lpFun не будет содержать никакой информаци о SomeClass???!

lpFun не будет содержать никакой информации об экземпляре SomeClass, мало того LPMF_CKINGFUNCTIONPTR lpFun = (LPMF_CKINGFUNCTIONPTR)&SomeClass->Function_ofF_RINGTYPE не скомпилируется
если имелось ввиду вот это
LPMF_CKINGFUNCTIONPTR lpFun = &SomeClass::Function_ofF_RINGTYPE;
то вызывать lpFun нужно будет не так, как это делается в builder, для методов с __closure:
Код

lpFun();

а так как это делают в С++:
Код

SomeClass inst;//экземпляр класса
typedef (SomeClass::*mem_func_type)();
mem_func_type lpFunc = &SomeClass::method;//указатель на метод
(inst.*lpFun)();//вызов функции

конструктивная критика:
щито такое __fastcall (); в теле класа?
Код

    lpCallMethod lpfun = ClassName::CallMethod;                
    TMyLib *Lib = new TMyLib(*(DWORD *)&lpfun); //<--

PM MAIL Skype GTalk   Вверх
vaddsm
  Дата 7.9.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Итак, я в отладчике )! Насчет ecx, ваша, правда. push ebp, mov ebp, esp, как я и писал, все тоже. Смотрим дальше...
PM MAIL   Вверх
mes
Дата 7.9.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Lazin @  7.9.2008,  18:28 Найти цитируемый пост)
щито такое __fastcall (); в теле класа?

__fastcall это (компиляторозависимое) соглашение о вызове, указывающая компилятору, что некоторые из параметров будут 
будут переданы не через стек, а прямо через регистры

Добавлено через 1 минуту и 8 секунд
http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%...%BE%D0%B2%D0%B0

Это сообщение отредактировал(а) mes - 7.9.2008, 18:51


--------------------
PM MAIL WWW   Вверх
vinter
Дата 7.9.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(mes @  7.9.2008,  19:50 Найти цитируемый пост)
_fastcall это (компиляторозависимое) соглашение о вызове, указывающая компилятору, что некоторые из параметров будут

не не ен, он имеет ввиду, что значит 
Код

__fastcall  ()
 {
  MessageBox(0, message, "Trick! ;)))", 0);
 };
вот это.
если я правильно понял.

Цитата(vaddsm @  7.9.2008,  19:46 Найти цитируемый пост)
 push ebp, mov ebp, esp, как я и писал, все тоже

ясен пень, это стандарные дейстивия, необходимые для возврата из процедуры.



--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 7.9.2008, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(mes @  7.9.2008,  18:50 Найти цитируемый пост)
__fastcall это

оп я не на то ответил )
__fastcall () - насколько я понял это перегрузка оператора инициализации объекта в борланде.
то есть new Class(); // <- вот тут вызывается..

Это сообщение отредактировал(а) mes - 7.9.2008, 19:12


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1120 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.