Probleme complique sur pointeur mais reponse simple surement

MrKribou Messages postés 21 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 8 novembre 2002 - 26 août 2002 à 01:11
jfloviou Messages postés 17 Date d'inscription samedi 23 mars 2002 Statut Membre Dernière intervention 25 septembre 2002 - 29 août 2002 à 04:21
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

jcecchi Messages postés 117 Date d'inscription samedi 12 janvier 2002 Statut Membre Dernière intervention 14 janvier 2003 3
26 août 2002 à 12:49
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.
0
cs_Kaid Messages postés 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
26 août 2002 à 15:52
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.
0
MrKribou Messages postés 21 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 8 novembre 2002
27 août 2002 à 01:06
Merci, j'ai essaye la premiere solution et elle marche impec. Pas eu le temps d'essayer la seonde.
Merci aussi pour les infos !
0
cs_Kaid Messages postés 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
27 août 2002 à 01:19
Dans les deux cas, n'oublies pas de libérer la mémoire que tu as allouée avec new.
0

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

Posez votre question
jcecchi Messages postés 117 Date d'inscription samedi 12 janvier 2002 Statut Membre Dernière intervention 14 janvier 2003 3
27 août 2002 à 02:24
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.
0
jfloviou Messages postés 17 Date d'inscription samedi 23 mars 2002 Statut Membre Dernière intervention 25 septembre 2002
29 août 2002 à 04:21
par ailleurs, il est simple d'utiliser getprivateprofilestrinf avec des char * ... il suffit de bient faire un cast adequat....
jaja
0
Rejoignez-nous