Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Ich werd da nicht ganz schlau draus....

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.03.2006, 18:07 Uhr
Karldin Shinowa
Professional Noob


was muss ich dieser Funktion als ersten Parameter übergeben???


C++:
int install_int_ex(void (*proc)(), int speed);



Einen Zeiger auf ne void Funktion oder???

wenn ich

C++:
install_int_ex(IncrementSpeedCounter,BPS_TO_TIMER(BSP));


schreibe mekert er:


In method `CTimer::CTimer(int)':
no matches converting function `IncrementSpeedCounter' to type `void (*)()'
candidates are: void CTimer::IncrementSpeedCounter()
C: \Dokumente und Einstellungen\Martin\Desktop\ALLEGRO\Makefile.win
[Build Error] [TimerDefs.o] Error 1

und

C++:
install_int_ex(&IncrementSpeedCounter,BPS_TO_TIMER(BSP));



will er auch nicht:

In method `CTimer::CTimer(int)':
taking the address of a non-static member function
to form a pointer to member function, say `&CTimer::IncrementSpeedCounter'

converting from `void (CTimer::*)()' to `void (*)()'
C: \Dokumente und Einstellungen\Martin\Desktop\ALLEGRO\Makefile.win
[Build Error] [TimerDefs.o] Error 1
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.

Dieser Post wurde am 26.03.2006 um 18:07 Uhr von Karldin Shinowa editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.03.2006, 19:00 Uhr
(un)wissender
Niveauwart


Die Fehlermeldung sagt's doch schon.
Es wird ein Funktionspointer erwartet, aber du übergibst einen Member-Funktionspointer.


C++:
void (*proc)() != void (CTimer::*proc)()


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.03.2006, 19:02 Uhr
Karldin Shinowa
Professional Noob


hmm kann ich das irgendwie casten????
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.03.2006, 19:44 Uhr
(un)wissender
Niveauwart


Klar, aber besser nicht. Da Member-Funktionspointer etwas ganz anderes sind und z.B. größer als ein normaler Funktionspointer (brauchen in der Regel noch 1-2 Maschinenwörter extra, für vt-index und this-Pointeroffset) wird das komplett scheitern.
Bau dir halt eine Funktion, die intern an das CTimer-Objekt rankommt und dessen Funktion aufruft. Unschön, aber mir fällt nichts anderes ein.
Übrigens: Wäre IncrementSpeedCounter static würde es auch so gehen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.03.2006, 20:07 Uhr
Karldin Shinowa
Professional Noob



Zitat von (un)wissender:

Bau dir halt eine Funktion, die intern an das CTimer-Objekt rankommt und dessen Funktion aufruft. Unschön, aber mir fällt nichts anderes ein.



das kapier ich nich ganz... kann man das auch einfacher ausdrücken?
oder meinste:

C++:
void Zugriff()
{
Timer.IncreaseSpeedCounter();
}
//und dann
install_int_ex(Zugriff,BPS_TO_TIMER(BSP));




Zitat von (un)wissender:

Übrigens: Wäre IncrementSpeedCounter static würde es auch so gehen.


Eine Static Member Funktion kann nicht eine nicht static Variable ändern oder?
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.

Dieser Post wurde am 26.03.2006 um 20:11 Uhr von Karldin Shinowa editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.03.2006, 20:17 Uhr
(un)wissender
Niveauwart


Nee kann sie nicht.

Star Wars fängt gerade an, trotz kurz auf die Schnelle:

C++:

static CTimer * globalTimer = 0;

void proc()
{
   assert(globalTimer);
   globalTimer->IncrementSpeedCounter();
}

int main()
{
   CTimer t;
   globalTimer = &t;
   install_int_ex(proc);
   t = 0;  
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.03.2006, 20:47 Uhr
Karldin Shinowa
Professional Noob


man lernt nie aus......
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.03.2006, 12:07 Uhr
RHBaum




Zitat:

Star Wars fängt gerade an, trotz kurz auf die Schnelle:


Ok, dafuer laesst man schon mal paar kleinigkeiten durchgehen ^^
Aber nu iss Starwars vorbei ^^


Zitat:

static CTimer * globalTimer = 0;


Globale variablen sind poese !!! An der stelle aber quasi Unumgaenglich. Nur besser (sauberer) Kapseln wuerd ich sie ...


Zitat:

Übrigens: Wäre IncrementSpeedCounter static würde es auch so gehen.



Genau das sollt das Ziel sein, weil methoden nun mal sauberer sind wie lose rumfliegende globale funktionen und variablen ... naja mindestens nen Namespace solltens sie spendiert bekommen !


C++:
class Counter
{
public:
    static inline void Increment(){++t;}
    static CTimer getCounter() const {return t;} // damit man auch zugriff hat ohne das private verletzen zu muessen ...
private:
    static CTimer t; // in irgend einer cpp datei sollte die natuerlich mal definiert/initialisiert werden, sonst gehts nich
};



// Wenn deine Klasse bekannt ist, kannst sie dann einfach nutzen ...


C++:
int main()
{
   install_int_ex(&Counter::Increment,/* was man noch braucht */);
}



Find ich sauberer, da nun variable und funktion durch die klassenzugehoerigkeit an nen kontext aber an keine Instanz gebunden sind. Rein Technisch fuern compiler isses das selbe wie das was unser star wars freund es schon vorgeschlagen hat ...

<huestel>
Fehler iss natuerlich versteckt drin, damit mans nich ohne nachdenken uebernhemen kann ! ^^

Ciao ...

Dieser Post wurde am 27.03.2006 um 12:15 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.03.2006, 18:42 Uhr
(un)wissender
Niveauwart


RHBaum hat natürlich recht, aber ich war schon 2 min über.
Und wie heißt es so schön, der Rest sei dem Leser zu Übungszwecken überlassen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: