En C++ fonction sqlite3_exec probleme de portée de variable

Hello

je vai essayer de faire simple
selon la doc ici
http://www.sqlite.org/c3ref/exec.html

On passe par une fonction callback qui est static que je reprend donc en c++
Le souci vien donc ce poser en c++ car la classe que je fait pour sqlite.

Je veux évidement récupérer les donnée de la base de donnée mai vu que c est une fonction callback en C static (ref la doc citer plus haut) sa ne peux pas ce faire sauf si je place une variable global.

Bon j’ai virer le reste du code pour y placer que ce qui nous interesse.

dans le *.h
//std::vector<std::string> vec_returne_valeur; //si je place sa ici sa marche évidement 
 
class sql {
       public : 
               bool recuperasion_donnee(std::string &table,std::string collonne_valeur, std::string recherche_quoi); //fonction qui donc appelle la fonction callback  je n'en place pas le code,car  le problème ne viens pas de là
	private:
		int callback(void *NotUsed, int argc, char **argv, char **azColName);
                std::vector<std::string> vec_returne_valeur;// ici c est hors de portée et donc sa miaule 
};

dans .cpp
 
 
 
int c_sql::callback(void *NotUsed, int argc, char **argv, char **azColName)
{
	int i;
	std::string tmp="";
	std::string mystring;//conversion en de char en string
	FOR(i=0; i<argc; i++)
	{
 
		std::cout << azColName[i] << " : " << argv[i]<< std::endl;
		mystring = std::string(argv[i]);//conversion en de char en string
		tmp=mystring;
		//vec_returne_valeur.push_back(tmp); //BUG hors de portée sauf si mis en globals
 
	}
	printf("\n");
 	RETURN 0;
} 
 

j’ai fait aux plus court pour montrer le problème:

donc le souci vien du fait que c’est static et une reprise du C lier a sqlite, meme si c’est placer en public (la fonction callback)
le problème reste le même.

question est donc comment faire pour éviter de placer le tableau de manière globale ?
vu que je ne peux pas toucher a première vue le nombre de paramètre ,je ne voit pas comment mis prendre.

Merci d’avance te de m’avoire lu.

[quote=“panthere”][quote]
sqlite.h: In static member function ‘static int c_sql::callback(void*, int, char**, char**)’:
sqlite.h:: error: invalid use of member ‘c_sql::vec_returne_valeur’ in static member function
sqlite.cpp:: error: from this location
sqlite.cpp: At global scope:
sqlite.cpp:: warning: unused parameter ‘NotUsed’
[/quote][/quote]
Comment t’a foutu tes inclusions ? Le « .h » inclus le « .cpp » ?

Ça résoud peut être pas ton problème mais je suis surpris.

Merci pour ta réponse
[edit]
bon je vai donner les sources sa ira plus vite je sens.
le fichier .sh me ser a compiler sans me taper un makefile

il te suffi de sois récupérer la ligne qui t’interesse dedans ou si tu veux t’en servir de modifier le chemin d’acès:
Rep="/chemin/daces/easy_sqlite"
projet_source_cpp_sql.tar (30 KB)

J’ai touché à ton code à droite à gauche pour ne plus utiliser stdio (ce serais dommage en C++) et j’ai corrigé ton problème.

Une fonction static ne peut utiliser que des données membres statics et des fonctions membre static ou qui ne touchent pas aux données membres non static.

Donc j’ai déclaré le vector en static et je l’ai initialisé en haut du fichier sqlite.cpp (il faut initialisé les données membres statics).

Du coup ça marche. En prime j’ai créé un makefile parce que c’est tout de même plus pratique :

Merci pour le coup de pouce :023
j’avais essayer de me débarrasser du studio.h mai sans succès.
Merci pour les explication j’y vois un peux plus clair, sa va servir :smiley:

pour le makefile j’ai de la peine a y comprendre quelque chose, mai j’imagine que si le projet deviens important sa reste indispensable, je mettrai donc le nez d’ici peux dedans :slightly_smiling:

Tu peut trouver pas mal de doc sur internet qui te l’expliqueront mieux que moi, mais si tu as une question n’hésite pas.

Là tu n’a pas à y toucher même si tu rajoute des .h et des .cpp comme pour sqlite.{cpp,h}, il s’occuperas des nouveaux fichiers tout seul :slightly_smiling: