tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
1618
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    arothe arothe ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    2
    Liebes Team,

    ich versuche mich seit Tagen daran einer Funktion aus einer C-Bibliothek eine C++ Funktionsreferenz zu übergeben.

    Bei der Bibliothek handelt es sich um den Jack-Audio Server. Der Server verbindet einen oder mehrere angemeldete Clients mit der Soundkarte und realisert so die Audio-Ausgabe. Ich selbst möchte für diesen Server einen Client schreiben, also ein Programm, dass Audio ausgibt.

    Um die Verbindung zum Server herzustellen, muss man dem Server eine Referenz auf eine Funktion übergeben, die dieser aufruft, wenn mein Programm seine Audio-Daten ausgeben darf. Mein Programm ist also in C++ geschrieben, folglich ist die Funktion, die Callback Funktion werden soll, eine Member Funktion. Normale C Funktionen werden von dem Server akzeptiert. Meine C++ Member Funktion jedoch nicht. Es gibt die folgende Fehlermeldung:

    argument of type 'int (Crasynth:(jack_nframes_type_t)(void*) does not match 'int (*)(jack_nframes_t, void*)'

    Ich bin schon ganz schön verzweifelt und googlen hat mir nichts gebracht, außer den Stichworten 'extern' und 'Templates', die ich aber nicht richtig verstehe.


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    #include ...
    #include <jack/jack.h>
     
    extern "C" int process (jack_nframes_t nframes, void *arg);
     
    using namespace std;
     
    class Crasynth{
        private:...
     
        
        public:
                    int                   create_client(...); //Hilfsfunktion zur Initialisierung
            int             process (jack_nframes_t, void*); //Soll Callback werden
            Crasynth();
            ~Crasynth();
        
    }; // Ende der Deklaration von Crasynth
     
    //-------------------------------------------------------------------------------------------------------------
     
    int Crasynth::process (jack_nframes_t nframes, void *arg){
        ... 
    }
     
    jack_client_t Crasynth::create_client(...){
          ...
          return jack_client;
    }
     
    // MAIN
    int main(){
        const char *client_name="Crasynth\n";
        Crasynth clientObj; //mein Objekt
            jack_client_t jackClient; //ein Client, den der Server schluckt
     
        jackClient= clientObj.createClient(...);
     
        jack_set_process_callback(jack_client, process, 0);
            /* Callback setzen geht nicht, weil C keine Memberfunktionen akzeptiert*/
     
        while(1);
    }

    Ich weiß wirklich nicht, was ich tu soll. Alles in C schreiben wäre eine unschöne Möglichkeit und stellt für mich keinen Ausweg dar. Ich muss C++ lernen!

    Ich bin für jeden Hilfsversuch dankbar!


    Viele Grüße
    Andreas
     

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo Andreas,
    Klassenmethoden können nur als Callback-Funktionen verwendet werden, wenn sie als "static" deklariert werden. Ansonsten passen die Aufrufkonventionen nicht zusammen.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  3. #3
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    So wie es aussieht kannst du ja einen beliebigen Parameter beim registrieren der Callbackfunktion mitgeben.

    So könntest du eine Wrapperfunktion schreiben:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    int Crasynth_process(jack_nframes_t frames, void* data) {
      Crasynth* obj = reinterpret_cast<Crasynth*>(data);
     
      return obj->process(frames);
    }
    ...
    Crasynth clientObj; //mein Objekt
     
    // registrieren:
    jack_set_process_callback(jack_client, &Crasynth_process, &clientObj);
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    arothe arothe ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    2
    Danke! Das funktioniert tatsächlich gut. Ich habe die Wrapper Funktion anschließend selbst noch in mein Objekt "integriert". Dazu musste ich sie dann allerdings static machen, was ja nicht störend ist.

    Gelöst! und sehr geholfen...

    Grüße.
     

Ähnliche Themen

  1. struct in eine Funktion übergeben
    Von parotech im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 07.01.11, 13:28
  2. Antworten: 1
    Letzter Beitrag: 16.12.08, 08:43
  3. Antworten: 9
    Letzter Beitrag: 10.10.06, 19:15
  4. Eine Variable von einer Funktion an eine andere übergeben
    Von pride im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 26.08.05, 22:59
  5. Funktion eine Variable übergeben?
    Von maho15 im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 14.07.02, 10:55