Remplir une structure "globale", comment ???

julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007 - 27 déc. 2005 à 14:43
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007 - 28 déc. 2005 à 18:38
Bonjour à tous,

voilà donc j'expose mon problème, si vous voulez bien :
je crée une structure dans un fichier .h lu par tous les fichiers de mon application :

struct COMPTE {
char * nom;
char * pass;
char * idMd5;
char * UNom;
char * UPrenom;
char * UAge;
char * UTxt;
};

static COMPTE SCom; //dans le même temps, je déclare une structure

Ensuite je rempli la structure SCom dans une classe grâce à une fonction créée ( SCom = fullCOMPTE(); ), seul hic, plutôt gros du moins, je veux que la structure soit globale, donc que les données soient lues partout, hors dés lors que je suis sorti de ma classe, les données n'existent plus, attention, la structure, elle (SCom) est bien reconnue. Comment faire SVP ??
En gros, je cherche à avoir l'équivalent d'une session en PHP

Merci pour votre aide les gens

16 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 déc. 2005 à 15:55
Sans doute parce que tes pointeurs pointent vers des emplacements locaux, qui sont libérés quand tu sors de la fonction. A la sortie, les pointeurs existent toujours mais sont invalides
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
27 déc. 2005 à 16:08
Alors comment faire pour avoir le résultat espéré ? J'avoue ne pas avoir tout compris à ta réponse ...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 déc. 2005 à 16:47
void f()
{
SCom.nom = "nom";
}

"nom" est allouée sur la pile, donc ca n'est plus correct quand on sort de la fonction. Pour que ca le reste, il faut allouer sur le tas:
SCom.nom malloc(X); // X au moins taille de la chaine + 1
strcpy(SCom.nom, "nom");
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
27 déc. 2005 à 17:10
j'ai bien compris là, mais enfaite, je fais ceci :

donc j'ai une classe, la fonction d'une classe : BOOL CInscription::CreateCompte(HWND hdlg, WPARAM wParam, LPARAM lParam)
Dans le fichier .h de cette classe, j'inclue objet.h, qui contient le prototype de ma fonction de remplissage de la structure en question : COMPTE fullCOMPTE(char*);
dans la classe, je fais : SCom = fullCOMPTE(nomCompte);
et quand je sors de la fonction et que je reste dans la classe, je teste les valeurs de ma structure avec MessageBox(hwnd, SCom.nom, SCom.pass,MB_OK);

là, ca marche, donc c'est la preuve qu'une fois sorti de la fonction, les valeurs sont bonnes et utilisables

prototype de ma fonction :

COMPTE fullCOMPTE(char * Nom)
{
COMPTE * p = new COMPTE;

MYSQL * m;

if((m = mysql_init(NULL)) != NULL && mysql_real_connect(m,SCon.host,SCon.login,SCon.pass,SCon.db,MYSQL_PORT,NULL,0)!=NULL)
{

MYSQL_RES * result;
MYSQL_ROW eC;
char mM[300];

wsprintf(mM,"SELECT * FROM comptes WHERE nameCompte='%s'",Nom);
if(mysql_query(m,mM) == 0)
{

result = mysql_store_result(m);

if(result != NULL)
{

eC = mysql_fetch_row(result);

p->nom = eC[1];
p->pass = eC[2];
p->idMd5 = eC[3];
p->UNom = eC[4];
p->UPrenom = eC[5];
p->UAge = eC[6];
p->UTxt = eC[7];

mysql_free_result(result);
mysql_close(m);

return * p;
}
}
}
MessageBox(hWnd,"Vérifier les connexions à la base MySQL, l'existence des tables de données et de votre compte.\n"
"Cette erreur provoque inéluctablement l'arrêt de l'application, veuillez réessayer ultérieurement\nDésolé."
,"Erreur",MB_ICONERROR|MB_OK);
mysql_close(m);
PostQuitMessage(EXIT_FAILURE);
}

voilà donc je ne pense pas qu'il s'agisse de ca grand Maitre
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
27 déc. 2005 à 17:27
sinon malloc() c'est du C nan ?
faudrait pas plutot SCom.nom = new char[X] ?, si je suis ton raisonement
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 déc. 2005 à 18:04
Comme tu veux, ca revient au même, mais je vois pas en quoi ca suit mon "raisonnement"
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
27 déc. 2005 à 18:18
c'est pas grave, ca marche pas quand meme.
sinon il existe pas autre chose qu'une structure qui équivaudrait une session en PHP ?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 déc. 2005 à 19:22
Je vois pas de malloc dans ton code précédent
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
27 déc. 2005 à 20:54
Tu declares la variable globale:
static COMPTE * pSCom = NULL;

Dans ta fn fullCOMPTE() retourne le pointeur COMPTE* au lieu de struct COMPTE.
Tu fais comme ceci:
COMPTE* fullCOMPTE(char * Nom)
{
COMPTE * p = new COMPTE;

MYSQL * m;
....

//aulieu de retourner *p, tu retourne la pointeur p
return p;
}

J'espère qu' avec ceci çà passera.
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
27 déc. 2005 à 21:02
Une autre methode: tu declares
static COMPTE SCom;

mais la fonction tu fais:
void fullCOMPTE(char * nom, COMPTE * p)
{
//et tu ne crées plus un nouveau compte avec new, tu mets juste en parametre l'adresse de la struct &SCom et basta.
}
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
28 déc. 2005 à 01:42
Désolé de paraitre débutant (je le suis en fait :D), mais là ca m'embrouille, donc j'essai ta méthode gagh1 et je change ma fonction, alors voilà je fais tout ca :

déclaration de la structure : const COMPTE SCom;
déclaration de la fonction de remplissage : bool fullCOMPTE(char*,COMPTE&);
prototype de la fonction : bool fullCOMPTE(char * Nom, COMPTE & p) { //.... }

et j'ai ce message d'erreur (je travaille sous Dev C++ 4.9.9.2) :
invalid initialization of non-const reference of type 'COMPTE&' from a temporary of type 'COMPTE**'
in passing argument 2 of 'bool fullCOMPTE(char*,COMPTE&)'

voilà, en fait je m'emêle avec les '*', les &, s'il faut en mettre ou pas, et quand etc...
quelqu'un pour m'éclaircir svp ?
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
28 déc. 2005 à 01:44
et et et...
pour faire appel à la fonction je met : fullCOMPTE(nameCompte,&SCom);

voilà tout est dit, faites vos jeux
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
28 déc. 2005 à 11:56
Fait attention, tu declares la fonction:
bool fullCOMPTE(char*, COMPTE*); // mais pas ...(char*, COMPTE&);
et pour faire appel à la fonction tu mets:
fullCOMPTE(nameCompte, &SCom);

Si tu utilises ta declaration:
bool fullCOMPTE(char*, COMPTE&);
tu fais comme ceci pour faire appel à la fn°:
fullCOMPTE(nameCompte, SCom);

et tu declares sans 'const' la struct SCom:
COMPTE Scom;
'const' veut dire que tu ne peux plus modifier sa valeur initiale.
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
28 déc. 2005 à 13:55
oui dsl je me suis trompé, je voulais dire "static"
merci pour tes conseils gagah1 mais, malheureusement, ca ne change rien, ca marche toujours pas
quelqu'un a une idée de comment faire autrement ? Si je réussi à ce que la structure soit globale, je doit bien réussir à avoir ses données globales elles aussi quand meme
L'idéal serai de remplir la structure à la déclaration, le problème c'est qu'il faut que le client s'enregistre avant, ou soit reconnu, fin je m'comprends, donc bah... bloqué...

s'il vous plait Grands Mages du C++, que dois-je faire ?
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
28 déc. 2005 à 16:07
Definit ta structure comme celle ci:
struct COMPTE {
char nom[taille_nom];
char pass[taille_pass];
char idMd5[taille_idMd5];
char UNom[taille_UNom];
char UPrenom[taille_UPrenom];
char UAge[taille_UAge];
char UTxt[taille_UTxt];
};
où taille_nom :le nbre maximale de caractère peut contenir le membre 'nom' etc...
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
28 déc. 2005 à 18:38
ca marche oui, fin ca marche, la structure n'est toujours pas globale,

je déséspére, mon application repose la dessus
0
Rejoignez-nous