Retour de string par ini et condition [Résolu]

- - Dernière réponse : cptpingu
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
- 17 août 2012 à 01:18
Bonjour,

c'est premier post sur mon forum, en général je trouve mes erreurs et arrive à les réparer. Je venais tout juste de me débloquer en apprenant à lire/écrire dans un fichier .INI, que je retombe dans un trou dont je n'arrive pas à sortir...

Je suis débutant (je n'ai pas encore vu les pointeurs sur le SdZ), et je suis en train de créer un jeu en console légèrement avancé. C'est un réel défi pour moi, à la fois un projet que j'aime bien mais aussi un exercice qui me permet de bien maîtriser ce que j'apprend tout au long de ma lecture.

Ainsi, j'en suis à l'affichage d'un message à l'utilisateur selon le retour d'une clef de mon fichier ini. Le code vous parlera mieux :

Main.cpp
mode =  bootingMode();
if (mode == false)
{
        displayFirstGameMessage(hackerName);
WritePrivateProfileStringA("system","booted","true",iniSave.c_str());
}


Fonction bootingMode()
bool bootingMode()
{
char buffer[255];
string saveFile  = "Data/system/ini files/saves.ini";
GetPrivateProfileStringA("system","booted","false",buffer,sizeof(buffer),saveFile.c_str());
cout << endl << "returned buffer : " << buffer << endl;
if (buffer == "false")
{
cout << endl << "function returns : false" << endl;
return false;
}
else
{
return true;
}
}



Avec ce code, aussi étonnant que cela puisse paraître, buffer vaut bien "false", cependant il ne rentre pas dans la condition "if (buffer == "false"), mais dans le "else" de celle-ci.

Je vous remercie d'avance pour l'aide que vous m'apporterez, moi je ne vois pas ce qui cloche...

PS : ne faites pas gaffe à "hackerName" comme nom de variable, mon jeu portant sur le hacking !
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
3
Merci
Bonjour,

il faut que tu remplaces :
if ( buffer == "false" )

par :
if ( strcmp( buffer , "false" ) == 0 )

Bye.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Lucky92
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
3
Merci
Explication : buffer (sans crochets) contient en fait un int représentant l'endroit où se trouve son contenu en mémoire (=un pointeur).
Donc si tu compares ce pointeur à celui de "false", vu que cette chaine sera d'office ailleurs en mémoire, la condition renverra toujours false.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_ghuysmans99
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
3
Merci
Bonjour.

Quand je laissais paraître "buffer", j'avais bien "false" et non une adresse pointeur

Je suppose que tu parles de faire un printf de buffer ?
Dans ce cas, apparaîtra ce que tu veux qu'il apparaisse, tout simplement.

Ex:
printf("%s", buffer); // Affichera  la chaîne de caractère "false"
printf("%i", buffer); // Affichera une adresse en décimal
printf("%x", buffer); // Affichera une adresse en hexadécimal


Si tu fais du C++, néanmoins, j'en profite pour te donner quelques conseils:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Si tu le peux, évite d'utiliser des char[] au profit de std::string ou de std::vector<char> (C'est vrai qu'ici tu n'avais pas le choix, vu que tu devais communiquer avec une API qui ne prenait que du char*).
- On ne compare pas un booléen, on l'utilise. Donc ceci: "if (mode == false)" devrait s'écrire "if (!mode)". (Ce n'est pas une erreur technique, mais c'est très moche :p).
- Pas besoin de "else" si tu as un "return" avant. Le return est "débranchant" (te fait quitter la fonction).

if (buffer == "false")
{
cout << endl << "function returns : false" << endl;
return false;
}
else
{
return true;
}

Pourrait s'écrire:
if (std::string(buffer) "false") // ou plus simplement strcmp(buffer, "false") 0, comme dit précédemment.
{
std::cout << std::endl << "function returns : false" << std::endl;
return false;
}
return true;


Voir même:
        const bool res = std::string(buffer) != "false";
std::cout << std::endl << "function returns : " << std::boolalpha << res << std::endl;
return res;


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
0
Merci
Oh, c'est super, réponse + explications y'a pas mieux. Je vous remercie. Cela dit, en phase de test, quand je laissais paraître "buffer", j'avais bien "false" et non une adresse pointeur.

Au début, je pensais que ça plantait puisque je comparais une chaîne string avec un tableau de 255 caractères...

Voilà tout marche. Je vous remercie encore !
Commenter la réponse de blacksoul305
0
Merci
Bonsoir,

encore merci pour vos explications et vos remarques quant à ma manières de coder. Je suis un grand débutant en C++, et n'ayant pas encore acheté de bouquin là dessus, je me contente de tutoriels sur le net.

En fait, "buffer" me retournait "false" quand en effet, j'ai tout simplement fait :
cout << buffer << endl;


Pour les "namespace", il va falloir que je me renseigne car je ne sais même pas à quoi ça sert. Je prendrai le temps de jeter un coup d'oeil à votre lien.

Rassurez-vous, si j'avais pu utiliser une banale variable string, j'l'aurai fait... Ça été d'ailleurs mon premier réflexe. Si vous saviez le temps que j'ai mis pour utiliser un fichier .INI, devinez ma peine quand j'ai eu ce problème là...

En ce qui concerne le return de la fonction, il est vrai que c'est juste une question de logique et donc pas la peine de mettre mon "else", merci de me l'avoir fait remarqué.

Merci encore pour toutes les informations que vous m'avez fourni. Ça fait plaisir !

PS : vous savez s'il y'a moyen d'éditer ses messages ?
Commenter la réponse de blacksoul305
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci

En fait, "buffer" me retournait "false" quand en effet, j'ai tout simplement fait :
std::cout << buffer << std::endl;

std::cout s'adapte au type pour trouer tout seul la représentation. Ex:
char buffer[] = "false";
int p buffer; // Pour simplifier, en vrai il faudrait plutôt écrire: int p static_cast(buffer); Mais oublie pour l'instant.
std::cout << "p 0x" << p << " buffer " << buffer << std::endl;
// Affichera p 0x4567981 (autre valeur chez toi et différente à chaque lancement) et buffer false"
// Pourtant p et buffer sont identiques.


Ne pas confondre valeurs et représentations. Tu n'es pas le premier débutant à avoir du mal avec cette notion. Je t'invite à lire ce sujet de forum, sur lequel le posteur à une question, certe, bien différente de la tienne, mais qui avait au final un problème de compréhension sur la notion valeur/représentation:
http://www.cppfrance.com/forum/sujet-BINAIRE_1603449.aspx


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu