Anzeige:
Ergebnis 1 bis 11 von 11

Thema: Funktion als Argument

  1. #1
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201

    Funktion als Argument

    Hi.
    Dieses Problem konnte ich wirklich nicht selbst lösen, die anderen haben sich ja nach 10 Minuten von selbst gelöst :rolleyes:

    Ich versuche einen Datensatz per sqlite auszulesen, das nimmt eine Funktion an, welche aber irgendwie nicht genommen wird:
    Code:
    int accounts::insRep(void *NotUsed, int argc, char **argv, char **azColName) {
      this->acclist.push_back(account(atol(argv[0]), argv[1], argv[2], atol(argv[3])));
        return 0;
    }
    
    accounts::accounts() {
      sqlite3* db;
      int rc = sqlite3_open("geepod.db", &db);
    
      if(rc) {
        exit(0);
      }
    
      char* errMsg;
       if(sqlite3_exec(db, "SELECT * FROM accouts;", this->insRep, 0, &errMsg) != SQLITE_OK) {
        sqlite3_close(db);
        exit(0);
      }
      sqlite3_close(db);
    }
    g++ ` pkg-config gtk+-2.0 --cflags` -o accounts.o -c accounts.cpp
    accounts.cpp: In constructor `accounts::accounts()':
    accounts.cpp:16: error: argument of type `int (accounts::)(void*, int, char**, char**)' does not match `int (*)(void*, int, char**, char**)'
    make: *** [accounts.o] Error 1
    Wieso nimmt der die Funktion nicht?

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Weil du versuchst, eine Methode einer Klasseninstanz als Funktionszeiger zu übergeben. Du kannst aber nur entweder Klassenfunktionen als Zeiger übergeben (die via Klassenname::Funktion aufgerufen werden) oder Funktionen ohne Klasse (also sowas wie main oder dergleichen). In diesem Fall kannst du nur eine normale Funktion übergeben, die nicht zu einer Klasse gehört.

    Alles hier gelernt

    Gruß,
    Hendrik

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Siehe mein Eintrag bei Tutorials, Tipps und Tricks zum Thema C Callbacks in C++

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592

  5. #5
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Code:
    #include "accounts.h"
    
    static int accounts::realinsRep(void *NotUsed, int argc, char **argv, char **azColName) {
      return insRep(NotUsed, argc, argv, azColName);
    }
    
    int accounts::insRep(void *NotUsed, int argc, char **argv, char **azColName) {
      this->acclist.push_back(account(atol(argv[0]), argv[1], argv[2], atol(argv[3])));
        return 0;
    }
    
    accounts::accounts() {
      sqlite3* db;
      int rc = sqlite3_open("geepod.db", &db);
    
      if(rc) {
        exit(0);
      }
    
      char* errMsg;
       if(sqlite3_exec(db, "SELECT * FROM accounts;", this->realinsRep, 0, &errMsg) != SQLITE_OK) exit(0);
    }
    g++ ` pkg-config gtk+-2.0 --cflags` -o accounts.o -c accounts.cpp
    accounts.cpp:3: error: cannot declare member function `static int accounts::realinsRep(void*, int, char**, char**)' to have static linkage
    accounts.cpp: In static member function `static int accounts::realinsRep(void*, int, char**, char**)':
    accounts.cpp:4: error: cannot call member function `int accounts::insRep(void*, int, char**, char**)' without object
    make: *** [accounts.o] Error 1
    Wie soll das jetzt bitte funktionieren? static kann kein this-> verwenden, aber es will nichtmal static sein.

    MfG

    Ich wäre auch dankbar für einen Alternativ-Vorschlag für SQLite, ich konnt nur nichts wie mysql_fetch_row() finden.
    Geändert von Giuly (15-11-2005 um 00:03 Uhr)

  6. #6
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Wie soll das jetzt bitte funktionieren? static kann kein this-> verwenden, aber es will nichtmal static sein.
    Du hast das static-Keyword falsch angewendet. Es gehört für deine Zwecke in die Klassendefinition. Giuly, hast du irgend ein Buch in dem du solche Dinge nachlesen kannst? Wenn nicht, kannst du für den Anfang mal in die C++ Annotations reinschauen (einfach mal googeln). Solches Grundlagenwissen eignet man sich IMHO besser durch Bücher bzw. andere strukturierte Dokumentation an.

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    NotUsed brauchst du schon

    Da mußt du die Instanz der Klasse an den Callback Registrierer übergeben, damit du in der static Methode dann die non-static aufrufen kannst.
    (Sogenanntes Kontext Argument, sollte eigentlich in meinem Beitrag stehen)

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  8. #8
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Zitat Zitat von locus vivendi
    Du hast das static-Keyword falsch angewendet. Es gehört für deine Zwecke in die Klassendefinition. Giuly, hast du irgend ein Buch in dem du solche Dinge nachlesen kannst? Wenn nicht, kannst du für den Anfang mal in die C++ Annotations reinschauen (einfach mal googeln). Solches Grundlagenwissen eignet man sich IMHO besser durch Bücher bzw. andere strukturierte Dokumentation an.
    Ich dachte die Definitionen und "Implentationen" müssen gleich sein? Oder kann man statische Funktionen nur in der Klassen-Definition definien, und nicht ausserhalb? Soll heißen:
    Code:
    class foo {
      static int bar() {
        return 1337;
      }
    }
    geht, aber
    Code:
    class foo {
      static int bar();
    };
    static int foo::bar() {
      return 1337;
    }
    nicht?

  9. #9
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    http://www.icce.rug.nl/documents/cplusplus/
    Kapitel 10: "Static data and functions"
    Wobei ich ehrlich gesagt den entsprechenden Abschnitt ein klein bisschen missverständlich finde (ein paar Dinge jedenfalls). Für den Anfang reichts aber.

  10. #10
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Ich habs jetzt verstanden, ich hab das mit dem reinterpret_cast<> und dass ich sqlite3_exec() einen poiter übergeben kann überlesen..

    Geht jetzt alles soweit
    Danke, ihr seit echt richtig hilfreich.
    Hier lohnt sichs echt auch -nach möglichkeit- zu helfen, man bekommt immer was zurück

  11. #11
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Ich habs jetzt verstanden, ich hab das mit dem reinterpret_cast<> und dass ich sqlite3_exec() einen poiter übergeben kann überlesen..

    Geht jetzt alles soweit
    Danke, ihr seit echt richtig hilfreich.
    Hier lohnt sichs echt auch -nach möglichkeit- zu helfen, man bekommt immer was zurück

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •