Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
SK Mini JLI'ler
Alter: 36 Anmeldedatum: 11.06.2005 Beiträge: 20
Medaillen: Keine
|
Verfasst am: 08.04.2006, 18:53 Titel: Zeiger |
|
|
Folgendes Problem:
Ich will einen Zeiger auf eine Methode in einem void-Zeiger speichern.
void* a = (void*)rayTracer.init;
Geht nicht laut Compiler.
ABER die Adressen auf globale Funktionen könn in nem void-Zeiger gespeichert werden:
void* a = WndProc;
Danke jetzt schon für Antworten. Wie gesagt ANTWORTEN kein Gelabb. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.04.2006, 19:14 Titel: |
|
|
__thiscall (klassenmethode) kann nicht zu __stdcall (globale funktion) konvertiert werden.
du könntest dir also höchstens eine Trampolinklasse schhreiben oder deine klassenfunktion statisch gestalten
btw:
void* <- böse sache vor allem bei funktionspointern kA weshalb das überhaupt funktioniert
PS: was bitte schön soll Gelabb sein? Gelaber? Tolle art als Bittsteller dinge zu verlangen _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
SK Mini JLI'ler
Alter: 36 Anmeldedatum: 11.06.2005 Beiträge: 20
Medaillen: Keine
|
Verfasst am: 08.04.2006, 19:22 Titel: |
|
|
Könntest du mir das mit der Trampolinklasse ein stückchen näher erklären?
Zitat: |
void* <- böse sache vor allem bei funktionspointern kA weshalb das überhaupt funktioniert
|
PS: Das meinte ich. Stellt doch nicht immer die Intensionen in Frage. Ich wollt nur wissen, wie ich das auf die Reihe kriegen kann und nicht dass man das nicht macht. |
|
Nach oben |
|
|
Maxim Senior JLI'ler
Anmeldedatum: 28.03.2004 Beiträge: 249
Medaillen: Keine
|
Verfasst am: 08.04.2006, 19:28 Titel: |
|
|
Also ich hab das eben ein wenig ausprobiert und ich glaube dass es nicht geht.
Mit Funktionen geht das, aber mit Methoden scheint es nicht zu funktionieren. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.04.2006, 19:33 Titel: |
|
|
Wir sind hier um uns gegenseitig zu helfen, ob du nun die gut gemeinten ratschläge annimmst ist deine sache
also zur trampolin klasse:
deine normale klasse (irgendeine halt):
CPP: | class foo
{
public:
int func(int a, int b)
{
return a+b;
}
}; |
und nun deine trampolin klasse in der du alle deine funcpointer auf klassen werfen kannst:
CPP: | class bar
{
public:
int(funcpointer*)(int,int);
}; |
und dann machste das einfach so:
CPP: | foo a;
...
bar b;
...
b.funcpointer=a.func;
...
int summe = b.funcpointer(4,6); // summe=10; |
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
SK Mini JLI'ler
Alter: 36 Anmeldedatum: 11.06.2005 Beiträge: 20
Medaillen: Keine
|
Verfasst am: 08.04.2006, 19:43 Titel: |
|
|
Hört sich gut an. Geht aber nicht.
Es kommt zum gleichen Fehler wie zuvor und ich hab keine blassen schimmer warum das eigentlich nicht geht. Aber thx. |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 08.04.2006, 19:44 Titel: |
|
|
void* ist widerlich.
Functors könnten dich evt. auch interessieren, weiß ja nicht genau, was du machen willst. |
|
Nach oben |
|
|
Maxim Senior JLI'ler
Anmeldedatum: 28.03.2004 Beiträge: 249
Medaillen: Keine
|
Verfasst am: 08.04.2006, 19:47 Titel: |
|
|
Was willst du überhaupt machen? Vielleicht gibt es eine andere Lösung für dein Problem. |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 08.04.2006, 19:50 Titel: |
|
|
Also das hier kompiliert immerhin
CPP: | struct a
{
void do_something(){}
};
int main()
{
a x;
void (a::*ptr)(void);
ptr = &a::do_something;
(x.*(ptr))();
}
|
EDIT:
muss es denn void* sein? _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
|
SK Mini JLI'ler
Alter: 36 Anmeldedatum: 11.06.2005 Beiträge: 20
Medaillen: Keine
|
Verfasst am: 08.04.2006, 19:52 Titel: |
|
|
@GreveN:
Hab ich was verpasst. Functors hör ich heut zum ersten mal. Geht das fix zu erklären; wenn ja dann los!
PS:
DANKE dass du gekonnt meine Bitte überlesen hast. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.04.2006, 19:57 Titel: |
|
|
Kampfhund hat Folgendes geschrieben: | Also das hier kompiliert immerhin
CPP: | struct a
{
void do_something(){}
};
int main()
{
a x;
void (a::*ptr)(void);
ptr = &a::do_something;
(x.*(ptr))();
}
|
EDIT:
muss es denn void* sein? |
Danke, wusste auch nicht mehr so genau wie es funktionierte zumindest war es im Ansatz richtig von mir
BTW: void* ist wirklich wiederlich und für functionspointer absolut daneben IMHO _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 08.04.2006, 20:04 Titel: |
|
|
CPP: | struct a
{
void do_something(){}
};
struct tramp
{
void (a::*ptr)(void);
};
int main()
{
a x;
tramp t;
t.ptr = &a::do_something;
(x.*(t.ptr))();
void *p_tramp = (void*)&t;
}
|
So, da hast du jetzt einen void zeiger auf das trampolin. Allerdings müsstest du später, wenn du die funktion aufrufen willst, sowieso wieder zurückcasten.
CPP: | (x.*(((tramp*)p_tramp)->ptr))();
|
Ja, natürlich, ich weiß beim lesen dieser Zeile sofort was sie tut
Ich weiß zwar nicht genau, warum du unbedingt die methode per pointer und dann auch noch per void pointer aufrufen willst, aber ich bin relativ sicher, dass es schönere und einfachere lösungen gibt. Wie GreveN würde ich zuerst Functors ausprobieren. Sonst kannst du ja auch mal bei boost schauen. Die haben afaik auch so function-binding helper klassen.
Fallen hat Folgendes geschrieben: |
Danke, wusste auch nicht mehr so genau wie es funktionierte zumindest war es im Ansatz richtig von mir
|
Ich musste auch erstmal testen ... Ich vergesse diese funktions/methoden-pointer-syntax ständig _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
|
SK Mini JLI'ler
Alter: 36 Anmeldedatum: 11.06.2005 Beiträge: 20
Medaillen: Keine
|
Verfasst am: 08.04.2006, 20:08 Titel: |
|
|
Komisch. Ich rufe die Zuweisung des Zeigers in einer Methode auf und dann gehts nicht. In einer normal Funktion laufts. Ist das logisch?
OK OK. Wenn ihrs unbedingt wissen wollt. Ich will innerhalb einer Klasse (beim Aufruf des Destruktors) checken ob eine bestimmte Methode aufgerufen worde bzw. ob überhaupt eine gecalled worden ist.
Da ich faul bin, will ich ne erst mit Konstanten rumhantieren sondern gleich per Zeiger die ganze Sache regeln.
PS: Hab ich was von aufrufen gesagt? |
|
Nach oben |
|
|
Maxim Senior JLI'ler
Anmeldedatum: 28.03.2004 Beiträge: 249
Medaillen: Keine
|
Verfasst am: 08.04.2006, 20:13 Titel: |
|
|
SK hat Folgendes geschrieben: |
Da ich faul bin, will ich ne erst mit Konstanten rumhantieren sondern gleich per Zeiger die ganze Sache regeln.
|
Das musst du erst mal erklären, denn ich kapier hier gar nichts.
Wie hast du es dir vorgestellt? |
|
Nach oben |
|
|
SK Mini JLI'ler
Alter: 36 Anmeldedatum: 11.06.2005 Beiträge: 20
Medaillen: Keine
|
Verfasst am: 08.04.2006, 20:19 Titel: |
|
|
So stell ich mir das vor
CPP: | class c
{
public:
c():
id(0)
{
}
~c()
{
if(id != 0)
{
cout << "Aaaa! a wurde gecalled."
}
}
void a()
{
id = a;
}
void* id;
};
|
|
|
Nach oben |
|
|
|