Probleme complique sur pointeur mais reponse simple surement

Signaler
Messages postés
21
Date d'inscription
dimanche 18 août 2002
Statut
Membre
Dernière intervention
8 novembre 2002
-
Messages postés
17
Date d'inscription
samedi 23 mars 2002
Statut
Membre
Dernière intervention
25 septembre 2002
-
Un probleme de pointeur je pense.

Je vous expose la situation :

Dans une Classe (ClassEx) voila je fais un truc du genre :

char* pChar = this->getInfo("info1", "info2");

getInfo c une methode de la classe qui ressemble a ca :

char* ClassEx::getInfo(char* anInfo1, char* anInfo2)
{
char info[100];
char* pInfo=info;

if (!GetPrivateProfileString(anInfo1, anInfo2, "", info, sizeof(info), _iniFile ))
MessageBox (NULL, "probleme de recuperation de donnees dans le fichier ini" , "erreur", 0 + MB_ICONASTERISK);

return pInfo;
}
GetPrivateProfileString sert a trouver une valeur d'une donnee a partir de cle (dans un fichier ini par exemple)
le probleme c'est que j'ai pas trouver de moyen pour que la fonction GetPrivateProfileString me renvois un char* alors je suis obliger d'utiliser char[] pour contenir l'info.
Etant donne que je tiens absolument a renvoyer un char* je met un pointeur vers le tableau info[]. Tant que je suis dans la methode, pInfo pointe sur la valeur qu'il faut, mais des que je retourne pInfo a pChar, mon pChar du debut lui pointe sur n'importe quoi (Alors qu'il devrait pointer sur la meme adresse que pInfo, c'est a dire le tableau non ?
Je viens du Java et je m'embroille pas mal avec ces pointeurs la (je pense que le probleme viens de la)

Si kkun pouvait m'aider a ce probleme ca pourrait me permettre d'avancer dns la comprehension des pointeurs (j'espere:))

J'en profite pour poser une question relative au C++. En java on se casse pas la tete on utilise la classe String, mais en C++, ya des char*, des char[], des LPCTSTR, des string, koi faut utiliser en priorite et en fonction de quoi ?

Merci pour les reponses meme si elles sont juste partielles :)

6 réponses

Messages postés
117
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
14 janvier 2003
3
Salut,

le probleme est tres simple.
En fait pInfo pointe sur info qui une variable locale. Tant que tu es dans ta fonction cette variable existe, mais des que tu renvoie pInfo, la fonction se termine et la variable info est detruite. Resultat : pInfo pointe sur une zone non valide et provoque une erreur.

Solution 1 :
recupère ta valeur dans info.
ensuite recupère la longueur de info (strlen).
alloue la memoire necessaire pour pInfo (new).
copie le contenu de info dans pInfo (strcpy).
retourne pInfo.

Solution 2 : (a verifier)
alloue l'espace memoire pour pInfo (new).
passe le en paramètre dans GetPrivate...
retourne pInfo.
En gros GetPrivateProfileString va mettre la chaine de caractère dans le buffer de pInfo (cad la zone mémoire reserve pour pInfo), mais toi tu n'as pas du faire de new donc ca marche pas.

Voila j'espere t'avoir aider.
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Pour ta deuxième question:

- char* et char[] sont "équivalent" et hérités du C.

- LPSTR, LPCSTR, ..., sont des définitions de types Win32 pour désigner des chaines de caractères.

- Sinon il reste les objets: CString avec les MFC, std::string avec la STL et bien d'autres.
Messages postés
21
Date d'inscription
dimanche 18 août 2002
Statut
Membre
Dernière intervention
8 novembre 2002

Merci, j'ai essaye la premiere solution et elle marche impec. Pas eu le temps d'essayer la seonde.
Merci aussi pour les infos !
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Dans les deux cas, n'oublies pas de libérer la mémoire que tu as allouée avec new.
Messages postés
117
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
14 janvier 2003
3
De rien.

Mais comme l'a dit Kaid (j'ai oublie de le dire), fait un delete des que tu n'as plus besoin de ta variable.
Messages postés
17
Date d'inscription
samedi 23 mars 2002
Statut
Membre
Dernière intervention
25 septembre 2002

par ailleurs, il est simple d'utiliser getprivateprofilestrinf avec des char * ... il suffit de bient faire un cast adequat....
jaja