# En C++ fonction sqlite3\_exec probleme de portée de variable

**URL:** <https://www.debian-fr.org/t/en-c-fonction-sqlite3-exec-probleme-de-portee-de-variable/28955>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 11:44 UTC](https://www.debian-fr.org/t/en-c-fonction-sqlite3-exec-probleme-de-portee-de-variable/28955 "2016-02-20T23:44:25Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 20, 2016, 11:44 UTC](https://www.debian-fr.org/t/en-c-fonction-sqlite3-exec-probleme-de-portee-de-variable/28955/1 "2016-02-20T23:44:25Z")

</div>

Hello

je vai essayer de faire simple  
selon la doc ici  
[http://www.sqlite.org/c3ref/exec.html](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.

```auto
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 
};

```

```auto
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;
} 
 
```

> [@](#):
>
> 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’

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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 11:44 UTC](https://www.debian-fr.org/t/en-c-fonction-sqlite3-exec-probleme-de-portee-de-variable/28955/2 "2016-02-20T23:44:29Z")

</div>

[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.

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 20, 2016, 11:44 UTC](https://www.debian-fr.org/t/en-c-fonction-sqlite3-exec-probleme-de-portee-de-variable/28955/3 "2016-02-20T23:44:37Z")

</div>

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](https://www.debian-fr.org/uploads/default/original/1X/bb32d847b7caacfc0fbe24e0038c40d3d5aeb347.tar) (30 KB)

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 11:44 UTC](https://www.debian-fr.org/t/en-c-fonction-sqlite3-exec-probleme-de-portee-de-variable/28955/4 "2016-02-20T23:44:41Z")

</div>

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 :

- make
- make exec
- make clean
- make mrproper  
[projet\_source\_cpp\_sql.tar.bz2](https://www.debian-fr.org/uploads/default/original/1X/b07cf4b63c4182d5411f49085fb5e51e823e97e2.bz2) (16.4 KB)

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 20, 2016, 11:44 UTC](https://www.debian-fr.org/t/en-c-fonction-sqlite3-exec-probleme-de-portee-de-variable/28955/5 "2016-02-20T23:44:42Z")

</div>

Merci pour le coup de pouce ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")  
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 😃

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 🙂

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 11:44 UTC](https://www.debian-fr.org/t/en-c-fonction-sqlite3-exec-probleme-de-portee-de-variable/28955/6 "2016-02-20T23:44:43Z")

</div>

> [@panthere](#):
>
> 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 🙂

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 🙂
