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
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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");
julien_boss
Messages postés165Date d'inscriptionsamedi 4 juin 2005StatutMembreDernière intervention24 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;
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
gagah1
Messages postés509Date d'inscriptionsamedi 28 juin 2003StatutMembreDerniè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;
}
gagah1
Messages postés509Date d'inscriptionsamedi 28 juin 2003StatutMembreDerniè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.
}
julien_boss
Messages postés165Date d'inscriptionsamedi 4 juin 2005StatutMembreDernière intervention24 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 ?
gagah1
Messages postés509Date d'inscriptionsamedi 28 juin 2003StatutMembreDerniè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.
julien_boss
Messages postés165Date d'inscriptionsamedi 4 juin 2005StatutMembreDernière intervention24 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 ?
gagah1
Messages postés509Date d'inscriptionsamedi 28 juin 2003StatutMembreDerniè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...