PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktion als Argument



Giuly
14-11-2005, 04:04
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:

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?

7.e.Q
14-11-2005, 05:48
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

anda_skoa
14-11-2005, 10:22
Siehe mein Eintrag bei Tutorials, Tipps und Tricks zum Thema C Callbacks in C++

Ciao,
_

locus vivendi
14-11-2005, 14:18
Das ist eine FAQ:
http://www.parashift.com/c++-faq-lite/pointers-to-members.html

Giuly
14-11-2005, 22:32
#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.

locus vivendi
15-11-2005, 14:02
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.

anda_skoa
15-11-2005, 17:35
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,
_

Giuly
15-11-2005, 17:43
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:

class foo {
static int bar() {
return 1337;
}
}geht, aber
class foo {
static int bar();
};
static int foo::bar() {
return 1337;
}nicht?

locus vivendi
15-11-2005, 19:20
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.

Giuly
15-11-2005, 19:58
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 :)

Giuly
15-11-2005, 19:59
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 :)