JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=ff1fc504478fd02e0e8f6311daa75696Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Zeiger
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
SK
Mini JLI'ler


Alter: 36
Anmeldedatum: 11.06.2005
Beiträge: 20

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 18:53    Titel: Zeiger Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.04.2006, 19:14    Titel: Antworten mit Zitat

__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 Rolling Eyes
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
SK
Mini JLI'ler


Alter: 36
Anmeldedatum: 11.06.2005
Beiträge: 20

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 19:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 19:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.04.2006, 19:33    Titel: Antworten mit Zitat

Wir sind hier um uns gegenseitig zu helfen, ob du nun die gut gemeinten ratschläge annimmst ist deine sache Wink

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
SK
Mini JLI'ler


Alter: 36
Anmeldedatum: 11.06.2005
Beiträge: 20

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 19:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 19:44    Titel: Antworten mit Zitat

void* ist widerlich.

Functors könnten dich evt. auch interessieren, weiß ja nicht genau, was du machen willst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 19:47    Titel: Antworten mit Zitat

Was willst du überhaupt machen? Vielleicht gibt es eine andere Lösung für dein Problem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 19:50    Titel: Antworten mit Zitat

Also das hier kompiliert immerhin Wink
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
SK
Mini JLI'ler


Alter: 36
Anmeldedatum: 11.06.2005
Beiträge: 20

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 19:52    Titel: Antworten mit Zitat

@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. Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.04.2006, 19:57    Titel: Antworten mit Zitat

Kampfhund hat Folgendes geschrieben:
Also das hier kompiliert immerhin Wink
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 Wink

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 20:04    Titel: Antworten mit Zitat

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 Wink

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 ... Wink Ich vergesse diese funktions/methoden-pointer-syntax ständig Sad
_________________
Kochen ist ein NP-schweres Optimierungsproblem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
SK
Mini JLI'ler


Alter: 36
Anmeldedatum: 11.06.2005
Beiträge: 20

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 20:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 20:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
SK
Mini JLI'ler


Alter: 36
Anmeldedatum: 11.06.2005
Beiträge: 20

Medaillen: Keine

BeitragVerfasst am: 08.04.2006, 20:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum