Remplir une structure "globale", comment ???

Signaler
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
-
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Alors comment faire pour avoir le résultat espéré ? J'avoue ne pas avoir tout compris à ta réponse ...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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");
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

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
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

sinon malloc() c'est du C nan ?
faudrait pas plutot SCom.nom = new char[X] ?, si je suis ton raisonement
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Comme tu veux, ca revient au même, mais je vois pas en quoi ca suit mon "raisonnement"
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

c'est pas grave, ca marche pas quand meme.
sinon il existe pas autre chose qu'une structure qui équivaudrait une session en PHP ?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Je vois pas de malloc dans ton code précédent
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010

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.
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010

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.
}
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

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 ?
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

et et et...
pour faire appel à la fonction je met : fullCOMPTE(nameCompte,&SCom);

voilà tout est dit, faites vos jeux
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010

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.
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

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 ?
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010

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...
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

ca marche oui, fin ca marche, la structure n'est toujours pas globale,

je déséspére, mon application repose la dessus