Ik raak de weg inmiddels een beetje kwijt. Ik ben geen professioneel C++ programmeur, maar ik kan er toch aardig mijn weg in vinden. Maar nu wil ik sqlite in mijn applicatie gaan gebruiken, en ik krijg het niet gecompileerd. Kan iemand me helpen?
Volgens de documentatie moet ik de volgende code gebruiken om een query uit te voeren:
De quickstart geeft een eenvoudig C voorbeeldje:
En zo werkt het bij mij ook. Echter, ik werk met C++, en ik wil alles in een object wegwerken. Alleen daar loop ik vast:
(Mijn probleem zit hem in de callbackfunctie, die wil ik erbij hebben. Als ik dat als 0 aanroep compileert het wel)
De __cdecl code heb ik erbij gezet omdat Visual Studio klaagde dat hij geen int(__thiscall db::*) naar int(__cdecl *) kon compileren, maar heel veel effect heeft het niet gehad:
En dat gaat dan uiteraard om regel 15 van het laatste stukje code. Weet iemand hoe ik ervoor zorg dat sqlite3_exec ook naar een member-function-pointer kan verwijzen? Ik kom er met Google niet uit, deze post leek nog wat te helpen, maar na het toevoegen van de function pointer kreeg ik dus nog steeds dezelfde foutmelding. Iemand?
Volgens de documentatie moet ik de volgende code gebruiken om een query uit te voeren:
C++:
1
2
3
4
5
6
7
| int sqlite3_exec( sqlite3*, /* An open database */ const char *sql, /* SQL to be evaluted */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *, /* 1st argument to callback */ char **errmsg /* Error msg written here */ ); |
De quickstart geeft een eenvoudig C voorbeeldje:
C:
1
2
3
4
| static int callback(void *NotUsed, int argc, char **argv, char **azColName){ // ... } rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg); |
En zo werkt het bij mij ook. Echter, ik werk met C++, en ik wil alles in een object wegwerken. Alleen daar loop ik vast:
(Mijn probleem zit hem in de callbackfunctie, die wil ik erbij hebben. Als ik dat als 0 aanroep compileert het wel)
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| class db { private: sqlite3 *cldb; public: bool query(string); int __cdecl select_callback(void *p_data, int num_fields, char **p_fields, char **p_col_names); }; int __cdecl db::select_callback(void *p_data, int num_fields, char **p_fields, char **p_col_names) { return 0; } bool db::query(string q) { char *zErr = 0; static int (__cdecl db::*fp)(void*, int, char**, char**); fp = &db::select_callback; if(sqlite3_exec(cldb, q.c_str(), fp, 0, &zErr) == SQLITE_OK) { return true; } else { return false; } } |
De __cdecl code heb ik erbij gezet omdat Visual Studio klaagde dat hij geen int(__thiscall db::*) naar int(__cdecl *) kon compileren, maar heel veel effect heeft het niet gehad:
code:
1
| cannot convert from 'int (__cdecl db::* )(void *,int,char **,char **)' to 'int (__cdecl *)(void *,int,char **,char **) |
En dat gaat dan uiteraard om regel 15 van het laatste stukje code. Weet iemand hoe ik ervoor zorg dat sqlite3_exec ook naar een member-function-pointer kan verwijzen? Ik kom er met Google niet uit, deze post leek nog wat te helpen, maar na het toevoegen van de function pointer kreeg ik dus nog steeds dezelfde foutmelding. Iemand?
It might sound as if I have no clue what I'm doing, but I actually have a vague idea.