Retour de string par ini et condition

Résolu
blacksoul305 - 16 août 2012 à 02:48
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 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 !

6 réponses

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
16 août 2012 à 08:29
Bonjour,

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

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

Bye.
3
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
16 août 2012 à 10:44
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
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
16 août 2012 à 16:24
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
3
blacksoul305
16 août 2012 à 14:51
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 !
0

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

Posez votre question
blacksoul305
16 août 2012 à 19:49
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 ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
17 août 2012 à 01:18

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
0
Rejoignez-nous