Fehlermeldung nach erstellen von klassen
-
Hi, ich hoffe mir kann jemand weiter helfen
Ich hab eine klasse erstellt, die folgende methoden enthält:
void* __stdcall BPMErkennung::dspCallback(void* originalbuffer,void* newbuffer, int length, void* param) { if(BPMDetection != 0) { for(int i=0; i< length - 1;i++) BPM_AddSample(BPMDetection, (float)BPMErkennung::getShortIntFromArray(reinterpret_cast<short*>(originalbuffer), i * 2)); } return newbuffer; } void BPMErkennung::DSPInit(void) { FSOUND_DSPUNIT *dsp; dsp = FSOUND_DSP_Create(dspCallback, FSOUND_DSP_DEFAULTPRIORITY_USER + 10, 0); FSOUND_DSP_SetActive(dsp, 1); }DSPInit ist im public bereich und dspCallback und die Variable BPMDetection im private.
Jetzt bekomm ich diese Fehlermeldung von Borland
[C++ Fehler] BPMKlasse.h(199): E2231 Element BPMErkennung::BPMDetection kann nicht ohne ein Objekt verwendet werden [C++ Fehler] BPMKlasse.h(202): E2231 Element BPMErkennung::BPMDetection kann nicht ohne ein Objekt verwendet werdenDie Fehlermeldung sagt mir gar nichts. Was meint denn der für ein Objekt?
ich hab mal spaßeshalber die BPMDetect auf static gesetzt und dann BPMErkennung::BPMDetection als Variable benutzt. Dann ist zwar diese fehlermdelung weg, aber wenn ich die Klasse in Borland definiere, bekomm ich ne fehlermeldung "unresoved external"
Wär echt nett wenn mir da jemand weiter helfen kann.
-
Hallo,
Könntest du uns noch die Klassendeklaration zeigen, damit wir wissen wovon du redest.

-
class BPMErkennung { private: int BPMDetection; static void* __stdcall dspCallback(void* originalbuffer,void* newbuffer, int length, void* param); static void BPM_AddSample(int bpm, float sample); static signed short getShortIntFromArray(signed short *buffer, int pos); double BPM_getParameter(int bpm, int param); int BPM_Create(void); void BPM_Destroy(int bpm); public: void Init(void); void Close(); double BPMWert(int param); void BPM_setParameter(int bpm, int param, double value); signed short getFloatFromArray(signed short *buffer, int pos); void BPM_Register(int code[10]); void DSPInit(void); };
-
Hallo
Du versuchst aus der statischen Methode dspCallback heraus die nichtsstatische Methode BPMDetection aufzurufen. Das geht natürlich nicht. Du must dein Klassenkonzept überdenken, im einfachsten Fall reicht es das static zu entfernen.
bis bald
akari
-
dspCallback ist static und besitzt damit keinen Zugriff auf den internen this-Pointer und kann somit auch nicht direkt auf BPMDetection zugreifen. Du müsstest dieser Funktion noch ein Objekt vom Typ BPMErkennung mit übergeben (oder BPMDetection direkt).
[edit]akari war schon wieder schneller.
Wenn er die Funktion, wie der Name schon sagt, als Callback-Funktione nutzen will, sollte sie schon static sein sonst wird das mit der Übergabe schwierig.[edit]
-
angangs habe ich das ganze auch ohne static gemacht, das problem ist, wenn ich es weg lasse dann komme diese Fehlermeldungen:
[C++ Fehler] BPMKlasse.h(202): E2034 Konvertierung von 'void * (__stdcall * (_closure )(void *,void *,int,void *))(void *,void *,int,void *)' nach 'void * (__stdcall *)(void *,void *,int,void *)' nicht möglich [C++ Fehler] BPMKlasse.h(202): E2342 Keine Übereinstimmung des Typs beim Parameter 'callback' ('void * (__stdcall *)(void *,void *,int,void *)' erwartet, 'void' erhalten)Irgendwie hanks immer an einer ecke

-
Hallo
Das ist genaus das was Braunstein gemeint hat. Du brauchst das static, weil du die Methode einem C-Funktionspointer zuweisen willst. Du must für die Callback-Methode noch einen Pointer auf die eigentliche Instanz mitgeben, dazu haben die meisten Callback-System noch einen extra void*-Parameter.
Hier findst du eine detaillierte Erklärung zum allgemeinen Konzept des Callbacksbis bald
akari