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

Поиск:

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


Эксперт
****


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

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



Цитата

Lazin, CallMethod где? ГИДЕ? Он в TAnyClass, а ты this передаеш какой? На TMyLibInterface.

ну да, незаметил, кстати а ты this какой передаешь? конструктор TMyLibInterface явно не в курсе о this экземпляра TAnyClass...

Добавлено через 2 минуты и 13 секунд
собрал под vs2005, пришлось заменить lpCallMethod lpfun = ClassName::CallMethod; на lpCallMethod lpfun = &ClassName::CallMethod;
запускаю, валится на асм вставке, и debug и release...
PM MAIL Skype GTalk   Вверх
vaddsm
Дата 8.9.2008, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Lazin, ) не обижайся, но ты жгешь.  smile  Зачем, весь этот асм если бы метод был описан TMyLibInterface. Я же по пунктам расписывал, как раскручивая стек мы получаем this TAnyClass. Но в последней реализации, там еще эмпирическим путем делается догадка о конвенции вызова метода, по тому какой опкод следует перед call TAnyClass() mov или push.

У меня в VS - шестерка работает, а вобщем-то забей. Продолжать в этом направлении что-то делать нет смысла, по тому, как я уже упоминал, стандартом является язык а не то как его конкретный компилятор представляет в машинном коде. Еще стандарт, конвенции вызовов функций, но здесь этого не достаточно.




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


Эксперт
****


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

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



Цитата

Lazin, ) не обижайся, но ты жгешь.
сам такой smile 
ты когда это писал, задумывался о том, что станет с твоим кодом, если пользователь, к примеру объявит хоть одну виртуальную функцию?

зы
раздел называется "С++ общие вопросы", для асма есть свой раздел
PM MAIL Skype GTalk   Вверх
W4FhLF
Дата 8.9.2008, 11:43 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(vaddsm @  8.9.2008,  10:57 Найти цитируемый пост)
Lazin, ) не обижайся, но ты жгешь.


Без обид, но жжёшь по-моему тут один ты. Ради экономии нескольких строк придумывать такой неповоротливый костыль... Лучше снабди библиотеку хорошей документацией и примерами, и сделай всё в рамках стандарта. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
vaddsm
Дата 8.9.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

ты когда это писал, задумывался о том, что станет с твоим кодом, если пользователь, к примеру объявит хоть одну виртуальную функцию?


Если клас будет унаследован от абстрактного или сам станет таковым после объявления виртуальных методов. То в самом начале, экземпляра подобного класса будет описываться VMT. А как это повлияет на алгоритм извлечения this? Конструктор то виртуалить нельзя. 

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

Добавлено через 6 минут и 42 секунды
Цитата

Без обид, но жжёшь по-моему тут один ты. Ради экономии нескольких строк придумывать такой неповоротливый костыль...


Темка, то как называлась... "Возможно ли ?". В целях самообразования между прочем. А то, что я предложил -- первый пришедший в голову, вариант. Верняк есть и другие, предложите свои.

Добавлено через 12 минут и 56 секунд
Цитата

Мраздел называется "С++ общие вопросы", для асма есть свой раздел


Серьезно?? и куда меня послали бы в этом разделе, с вопросом о выполнении кода при инициализации экземпляра объекта c++ класса. 

В лучшем случае в этот раздел.  smile 
PM MAIL   Вверх
Lazin
Дата 8.9.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Если клас будет унаследован от абстрактного или сам станет таковым после объявления виртуальных методов. То в самом начале, экземпляра подобного класса будет описываться VMT. А как это повлияет на алгоритм извлечения this? Конструктор то виртуалить нельзя. 

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


Цитата

Серьезно?? и куда меня послали бы в этом разделе, с вопросом о выполнении кода при инициализации экземпляра объекта c++ класса.

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


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


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


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

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



Цитата(vaddsm @  8.9.2008,  10:13 Найти цитируемый пост)
Хотя я сейчас еще гляну, как коверкается код при оптимизации, мож че придумаю и на этот раз 

В любом случае такое решение получится одноразовым (непереносимым).
Я все таки считаю , что лучше смотреть в сторону  стандартных языковых возможностей. 
Вы можете привести пример желаемого взаимодействия клиентского кода с библиотекой без учета  реализации?

Это сообщение отредактировал(а) mes - 8.9.2008, 13:22


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


Шустрый
*


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

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



Ладно, давайте забудем на время о методе, в адрес которого прозвучала критика. И так, как единогласно было решено – нормального, соответствующего стандартам, способа реализации того, что я хотел видеть – нет. 

Предложите свои:

Некоторая библиотека предоставляет свой функционал через методы класса TMyLib.

Самым простым способом применения, является вызов ее функций в конструкторе, класса для которого она применяется:

Код

TAnyClass()
{

 MyLib.Function(_ИМЯ_МЕТОДА1_, _ИМЯ_МЕТОДА2);
 MyLib.Function(_ИМЯ_МЕТОДА3_, _ИМЯ_МЕТОДА4);

}


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






PM MAIL   Вверх
W4FhLF
Дата 8.9.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Код

MyLib.Function(_ИМЯ_МЕТОДА1_, _ИМЯ_МЕТОДА2);


Что здесь происходит? Вызов _ИМЯ_МЕТОДА1_, а потом _ИМЯ_МЕТОДА2? Или просто сохранение их адресов? Как тогда потом это применяется? 

Цитата(vaddsm @  8.9.2008,  14:23 Найти цитируемый пост)
 так, как библиотека задает поведение методов класса, устанавливает правила.


Что значит задаёт поведение методов класса? Какие правила? 
Код метода статичен. Следовательно, на его поведение могут влиять только переменные-члены класса или аргументы при вызове. 

Или в библиотеке существует некоторый унифицированный интерфейс и TMyLib задаёт методы вызова, которые потом где-то кем-то вызываются? Если так, то где и кем? 

Я пытаюсь въехать в задачу smile



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
mes
Дата 8.9.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vaddsm @  8.9.2008,  14:23 Найти цитируемый пост)
Самым простым способом применения, является вызов ее функций в конструкторе, класса для которого она применяется:

Это опять реализация... Пострайтесь именно о интерфейсе/функционале библиотеки рассказать.


Цитата(W4FhLF @  8.9.2008,  14:49 Найти цитируемый пост)
Я пытаюсь въехать в задачу smile

 smile  7я страница уже заканчивается, а основная задача до сих пор под покровом тайны  smile 


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Код

#define TABLE_DEF(Base) \
class CallMe { \
 Base* self; \
public: \
 CallMe() {self=(Base*)( ((char*)this)-offsetof(Base,my_class_instance)); self->call_whatever_you_need();} \
} my_class_instance;

class Test {
public:
TABLE_DEF(Test)

 void call_whatever_you_need();
};

Жуть конечно, но гораздо более переносимо, чем asm вставки   smile 


Это сообщение отредактировал(а) xvr - 8.9.2008, 18:31
PM MAIL   Вверх
vaddsm
  Дата 9.9.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ОГО!  smile, Понятия не имел о существовании такого макроса offsetof, пытался сделать другим способом подобное, но натыкался на грабли с выравнованием структуры. Это супер! До Вас тут яросно пытались доказать что невозможно это, кто-то даже про фортачку вспоминал, ну вот пускай сейчас туда сам лезит.  smile  Ох-р-и-неть! Круто! 

Надо успокоится. Теперь посути, какие недостатки видят участники форума в данном методе?, я лично считаю что код 100% рабочий и переносимый. 

Цитата

Что значит задаёт поведение методов класса? Какие правила? 


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

Цитата

Код метода статичен. 


Статичен, до поры до времени.

Цитата

Следовательно, на его поведение могут влиять только переменные-члены класса или аргументы при вызове. 


Следовательно не так.

Цитата

7я страница уже заканчивается, а основная задача до сих пор под покровом тайны


Как я вижу, основная задача решена xvr. 

Цитата

Или в библиотеке существует некоторый унифицированный интерфейс и TMyLib задаёт методы вызова, которые потом где-то кем-то вызываются? Если так, то где и кем? 


Нет, библиотека, патчит методы в рантайме, для решения некоторой удивительной задачи. Но знание об этом вам помогут, дать подсказку мне?

Добавлено через 7 минут и 50 секунд
xvr, Умница!  smile  У меня при всех условиях работает верно. smile 
PM MAIL   Вверх
vaddsm
  Дата 9.9.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Причем, благодаря именно такой реализации мой код будет вызываться значительно раньше всего, что будет описано в конструкторе класса. И это мне тоже, очень надо!
PM MAIL   Вверх
mes
Дата 9.9.2008, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vaddsm @  9.9.2008,  00:07 Найти цитируемый пост)
xvr, Умница!  smile 

 smile  Поддерживаю.  +1


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


Шустрый
*


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

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



Ага, поставьте +, будет 100 постов присоеденюсь! smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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