|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 08.04.2006, 20:32 Titel: |
|
|
Und wieso ist das einfacher als den funktionsnamen oder eine id einfach in nem string/integer zu speichern?
In diesem Beispiel wäre das ja kein Problem. Ich weiß ja nicht wie das nun in deinem Projekt aussieht. Hast du da haufenweise Funktionen und willst wissen welche davon ausgeführt wurde?
Wenn du nur prüfen willst ob eine bestimmte Funktion aufgerufen wurde kannst du auch einfach eine boolesche Membervariable dafür anlegen. _________________ 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:40 Titel: |
|
|
1. strings sind länger als ne einfache Zahl, d.h. ein bisschen langsamer
2. die IDs, die ich erst definiere, muss ich auch selber werwalten
FAZIT: Zeiger gehen einfacher, ich spare zeit und nerven (wenns ja gehen würde) und jetzt fragt bitte nicht immer warum ich das so machen will.
Tatsache ist ,dass es so nicht geht und ich nicht kapier wieso. Deshalb hab ich hier gepostet, damit man mir den Grund verrät und MICH nicht ständig fragt, wie mans anders machen könnte. |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 08.04.2006, 21:16 Titel: |
|
|
CPP: | struct a
{
void do_something(){}
int do_something_else(){return 0;}
int do_with_param(int x){return x;}
};
template<class T>
unsigned int get_address_of(T method_ptr)
{
union
{
T ptr;
unsigned int address;
}t;
t.ptr = method_ptr;
return t.address;
}
struct c
{
unsigned int address_of_called_func;
~c()
{
if( address_of_called_func == get_address_of(&c::call_me) )
{
std::cout<<"Erwischt! Nicht aufrufen junge!!!!11"<<std::endl;
}
else
{
std::cout<<"Alles klar!"<<std::endl;
}
}
long call_me(unsigned int x,char* b,std::ostream& s)
{
address_of_called_func = get_address_of(&c::call_me);
return 0;
}
};
int main()
{
std::cout<<get_address_of(&a::do_something)<<std::endl;
std::cout<<get_address_of(&a::do_with_param)<<std::endl;
{
c the_c;
the_c.call_me(0,0,std::cout);
}
{
c the_c_revived;
}
std::cin.get();
}
|
_________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
|
proggaholic Junior JLI'ler
Alter: 36 Anmeldedatum: 07.05.2005 Beiträge: 85 Wohnort: Heap Medaillen: Keine
|
Verfasst am: 03.05.2006, 21:49 Titel: |
|
|
Zu der Sache mit dem void-Zeiger:
Es ist unzulässig, ihm einen (neuen) Wert über eine Dereferenzierung zuzuweisen. Mit anderen Worten, er darf nicht schreibend auf den Wert zugreifen. Damit sollte sowas nicht gehen:
CPP: | int foo = 42;
// Gültig
void *bar = &foo;
// Sollte Fehler verursachen
*bar = 23;
|
Der konkrete Fehler, der bei dir auftritt, könnte ausgelöst werden,
weil du versuchst, zu void* zu casten (c-cast? Ist die Frage, wie es da mit Zeigern auf Funktionen aussieht). Weil void* aber sowieso keinen bestimmten Typ hat, ist das vielleicht der Grund, warum der Compiler meckert. Konvertierung ist einfach nicht definiert. Vielleicht ist das aber auch nicht ganz richtig, war nur so ein Einfall. Vielleicht kommst du damit einen kleinen Schritt weiter.
mfg
proggaholic |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 04.05.2006, 12:37 Titel: |
|
|
ist schon ein wenig frech, heir so zu kommen, und so vorderungen zu stellen aber naje (wenn du vielelich tkein Newbe bist, so gibts es heir doch sicherlich einige, die sich vielelicht nciht vorher lange überlegt haben, warum es nur diese eine Lösung gibt. Dann kann man das aber auch sagen, und nicht sowas fordern wie bitte nur Antworten und kein gelaber)
Der Grund das Globale Funktionen gehen, Member aber nicht wird denke ich der selbe sei, wie der das man CALLBACK funktionen nicht einfach so als Member machen kann. Denn eine Memberfunktion muss wissen auf welches Objekt sie zeig,t bzw. zu welchem sie gehört, damit auch schön imemr das richtige Objekt manipuliert wird. Daher fügt der Compiler im Funktionsaufruf imemr noch so ne Art Zeiger auf das Objekt hinzu, damit die Funktion das richtige macht. Speicherst du nur den Zeiger auf eine Funktion geht diese Information höchstwahrscheinlich verloren, d.h. du hast ne Memberfunktion ohne Objekt und das kann ja nicht gehen.
Ist die Memberfunktion statisch müsste es gehen, dann hast du alelrdings keinen Zugriff auf nichtstatische Klassenelemente mehr. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
|
|
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
|