|
Тема |
Re: я като си зачекал темата [re: zaphod] |
|
Автор |
void* (психопат) |
|
Публикувано | 24.05.05 03:27 |
|
|
браво, тва изглежда е много як проект, щом трябва да се правят такива клизми!
първото нещо, което ми дойде наум като прочетох описанието е това: . swig е софтваре, което генерира врапери за C/C++ код, които да се ползват от скриптови езици като перл и питон. в крайна сметка се получава динамична библиотека, която скриптовите езици могат да заредят и ползват.
оттук идва и въпросът ти откъде точно изпълняваш код? щото спомена за длл-ки нещо. аз си представям обаче, че си имаш няква C++ програма, в която има много неща, класове, функции, едно друго... едно от тези неща сигурно функция от сорта на
void execute(const char *program);
program е интерпретираната програма и ти вероятно искаш в нея да можеш да кажеш
a = create_object_of_type(A);
a.invoke_native_method(func1, param1, param2);
или направо
a.func1(param1, param2);
тоест класовете, с които искаш да работиш са част от самия интерпретатор, но трябва да се виждат/ползват и от интерпретирания код.
аз лично не бих се опитвал обаче да ползвам директно класовете от програмата. за всеки клас A може да се напише
class A_extender : public A
{
public:
static A_extender* Create();
static A_extender* Create(int param);
static A_extender* Create(char * param);
static void Destroy(A_extender*);
static bool Invoke(A_extender* obj, const char *method, int argc, char **argv);
private:
// invoke the respective constructors of A, which may be many
A_extender();
A_extender(int param);
A_extender(char * param);
~A_extender();
}
ще регистрираш статичните функции за създаване/затриване, които са си обикновени указатели.
в случая адресите на оверлоаднати функции се взимат с клизма
за всяка ще се прави нещо подобно (в случай, че изобщо искаш да са с оверлоаднати функциите):
A_extender* (*pFunc)(int param) = A_extender::Create; // the 2-nd
int create_addr = reinterpret_cast<int>(pFunc);
ако можеш да жертваш малко скорост, си пишеш Invoke функция за всеки клас и градът спи. това е най-елементарното и безболезнено решение, според мен. а данните както и сега ще си ги регистрираш по отместване, там няма нищо особено.
а ако трябва да се викат директно функциите ще е по-сложно. това ще се мисли в друг пост евентуално.
като гледам, че указателят към член функция е 8 байта ме обзема силно подозрение, че първите 4 са указател към началото на функцията, а вторите са отместване от this на текущия обект (ако не се ползва множествено наследяване отместването е 0).
например имаме следната йерархия
class A
{
public:
int a_func() { return a_data; }
int a_data;
};
class B
{
public:
int b_func() { return b_data; }
int b_data;
};
class C : public A, public B
{
public:
int c_func() { return c_data; }
int c_data;
};
C c;
int (C::*pFunc2)() = &C::b_func; // inherited from B!
(c.*pFunc2)(); // call the function with the this pointer set to the B subobject (it's at some offset from &c)
pFunc2 = &C::c_func; // C's own
(c.*pFunc2)(); // call the function with the this pointer set to the C object (zero offset here)
виждаш, че не можеш да викаш директно функциите, като им даваш &c за първи параметър, защото не всички искат един и същи this. в случая само с единично наследяване началата на всички подобекти съвпадат и this е един и същи за всички.
ако викаш направо c.b_func() компилаторът си настройва this-а без въобще да разбереш, но като се ползват указатели към член необходимото отместване става ясно чак в runtime. затова не можеш да кастваш такива указатели както си искаш.
unsigned
|
| |
я пробвайте да компилирате това:
| zaphod
| 20.05.05 12:04 |
Я пак, че не разбрах нещо
| Colombino
| 20.05.05 13:11 |
Re: Я пак, че не разбрах нещо
| Pekoнcтpykтop
| 20.05.05 15:42 |
Не точно
| Colombino
| 20.05.05 16:01 |
Re: Не точно
| Dorian_Gray
| 20.05.05 16:49 |
Именно, де
| Colombino
| 20.05.05 17:00 |
"членове с деструктори"-ебааа!!!
| focusnik
| 20.05.05 17:27 |
Re: Я пак, че не разбрах нещо
| void*
| 20.05.05 17:15 |
Другари!
| BjarneStroustrup®
| 21.05.05 10:07 |
Re: Другари!
| Colombino
| 21.05.05 12:26 |
Re: Другари!
| BjarneStroustrup®
| 21.05.05 12:48 |
Re: Другари!
| Colombino
| 21.05.05 13:15 |
Re: Другари!
| void*
| 22.05.05 02:05 |
Тва на мен ли го казваш?!?
| Colombino
| 22.05.05 14:39 |
Re: Тва на мен ли го казваш?!?
| void*
| 22.05.05 20:07 |
Re: Тва на мен ли го казваш?!?
| BjarneStroustrup®
| 25.05.05 12:32 |
Не вярвам
| Colombino
| 25.05.05 15:45 |
Re: Не вярвам
| BjarneStroustrup®
| 25.05.05 16:35 |
Re: Тва на мен ли го казваш?!?
| void*
| 25.05.05 16:24 |
Re: Тва на мен ли го казваш?!?
| BjarneStroustrup®
| 25.05.05 16:37 |
Re: Другари!
| xyz
| 21.05.05 16:46 |
Re: Другари!
| Colombino
| 21.05.05 20:12 |
Re: Другари!
| zaphod
| 21.05.05 20:40 |
Re: Другари!
| Colombino
| 21.05.05 21:00 |
Re: Другари!
| xyz
| 21.05.05 21:39 |
Re: Другари!
| zaphod
| 21.05.05 23:30 |
Re: Другари!
| xyz
| 22.05.05 01:33 |
Re: Другари!
| zaphod
| 22.05.05 09:02 |
Re: Другари!
| xyz
| 22.05.05 23:20 |
Бъди джигит!
| Colombino
| 22.05.05 23:40 |
Re: Бъди джигит!
| xyz
| 23.05.05 13:14 |
бе това на къв компилатор
| zaphod
| 23.05.05 14:35 |
Re: бе това на къв компилатор
| Colombino
| 23.05.05 14:55 |
оправих го
| zaphod
| 23.05.05 15:03 |
я като си зачекал темата
| zaphod
| 23.05.05 13:37 |
Баси извратения синтаксис!
| Colombino
| 23.05.05 16:20 |
Re: Баси извратения синтаксис!
| zaphod
| 23.05.05 17:49 |
Re: я като си зачекал темата
| void*
| 23.05.05 20:32 |
Re: я като си зачекал темата
| zaphod
| 23.05.05 21:48 |
IDispatch
| ~!@$%amp;^*()_+
| 23.05.05 22:54 |
Re: IDispatch
| zaphod
| 24.05.05 08:33 |
Re: IDispatch
| ~!@$%amp;^*()_+
| 24.05.05 10:02 |
Re: я като си зачекал темата
| void*
| 24.05.05 03:27 |
Re: я като си зачекал темата
| zaphod
| 24.05.05 08:22 |
Re: я като си зачекал темата
| void*
| 24.05.05 14:06 |
тоя метод за викане на конструктор
| zaphod
| 23.05.05 14:26 |
Не бачка?!?
| Colombino
| 23.05.05 14:33 |
Re: Не бачка?!?
| zaphod
| 23.05.05 14:53 |
ами очаквах
| zaphod
| 20.05.05 16:18 |
Я пак помисли
| Colombino
| 20.05.05 16:48 |
Re: ами очаквах
| void*
| 20.05.05 17:19 |
Re: ами очаквах
| Colombino
| 20.05.05 17:25 |
Re: ами очаквах
| void*
| 20.05.05 18:14 |
Re: ами очаквах
| Colombino
| 20.05.05 18:23 |
Re: ами очаквах
| void*
| 20.05.05 18:29 |
Ми не знам
| Colombino
| 20.05.05 18:37 |
Re: Ми не знам
| focusnik
| 20.05.05 18:43 |
Re: Ми не знам
| void*
| 20.05.05 19:11 |
Не съм съгласен, мистерията остава
| Colombino
| 20.05.05 20:01 |
Re: Не съм съгласен, мистерията остава
| void*
| 20.05.05 20:28 |
ето и окончателния отговор
| void*
| 22.05.05 03:12 |
Re: ето и окончателния отговор
| явepтъ
| 24.05.05 02:31 |
Re: Не съм съгласен, мистерията остава
| zaphod
| 20.05.05 22:35 |
Re: Не съм съгласен, мистерията остава
| void*
| 21.05.05 00:56 |
ц++ има адски много кусури
| ~!@$%amp;^*()_+
| 21.05.05 02:04 |
Re: ц++ има адски много кусури
| void*
| 21.05.05 12:01 |
Re: Не съм съгласен, мистерията остава
| zaphod
| 21.05.05 07:56 |
Re: Не съм съгласен, мистерията остава
| BjarneStroustrup®
| 21.05.05 11:14 |
Подкрепям
| Colombino
| 21.05.05 12:32 |
Re: Подкрепям
| BjarneStroustrup®
| 21.05.05 12:50 |
Re: я пробвайте да компилирате това:
| Чвopko
| 20.05.05 13:38 |
Re: я пробвайте да компилирате това:
| Пeтpocян
| 20.05.05 13:40 |
|
|
|
|