Qstring en char* (et non const char*)

Résolu/Fermé
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 - Modifié par linkcr15 le 25/01/2012 à 23:20
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 27 janv. 2012 à 08:15
Bonjour tout le monde!

je me suis mis à réaliser des fenêtres sous Qt Creator. J'essaie donc d'associer un de mes projets C++ à une fenêtre simple. L'utilisateur est censé entré une chaine (sous forme de QString dans le code que j'utilise). Je dois ensuite envoyer cette chaîne à une fonction sauf que la fonction n'accepte que les char*. J'ai recherché les fonctions de conversion de QString en char*, mais je ne trouve que QString en const char*. Tout le monde dis que c'est la même chose sauf que ma fonction n'accepte pas les const char*. Est-ce que quelqu'un sait comment je peux obtenir un char* svp?
PS : le cast char* sur un const char* ne fonctionne pas.

Merci d'avance pour toutes vos réponses et je me tiens à votre entière disposition!


4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
26 janv. 2012 à 00:22
Tout le monde dis que c'est la même chose
oO. Pourtant ça n'a rien à voir. Si une fonction prend en paramètre un char* (car elle modifie l'adresse du pointeur) tu obtiendras une erreur en lui envoyant un const char*.
As-tu essayé :
QString qs = "coucou"; 
char *chaine = qs.toStdString().c_str();

?
Cdlt,
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
Modifié par linkcr15 le 26/01/2012 à 02:02
Tout le monde dis que c'est la même chose
J'ai lu par là qu'un code bien programmé ne faisait pas de différence entre char* et const char*.

En essayant ta méthode fiddy, j'obtiens cette erreur à la compilation : invalid conversion from 'const char*' to 'char*'. Pour mieux comprend, je post le bout de mon code qui ne fonctionne pas :

QString expr = QInputDialog::getText(this, "Expr", "Expression?");
new QLabel("Expression ecrite : " + expr, this);
char* ch = expr.toStdString().c_str();
Expression* e;
e=analyseExpression(ch);

Le programme ne compile plus à partir de la dernière ligne du code donné, et c'est ici qu'il m'affiche l'erreur de char*. Voici le prototype de la fonction analyseExpression : Expression* analyseExpression(char* &s);

J'arrive vraiment pas à placer ce paramètre pour appeler la fonction...


EDIT : J'ai finalement trouvé un moyen (je ne pense pas qu'il soit optimal mais au moins il fonctionne), je vous donne donc ma solution :

QString expr = QInputDialog::getText(this, "Expr", "Expression?");
new QLabel("Expression ecrite : " + expr, this);
char* ch = expr.toStdString().c_str();
Expression* e;
char* ex;
ex=const_cast<char *>(ch);

e=analyseExpression(ex);

Aucune erreur à la compilation et le programme fonctionne bien. J'espère que cela pourra vous aider! Et merci à fiddy pour l'attention qu'il m'a porté!
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
26 janv. 2012 à 09:32
Salut.
Ce qui est étrange là dedans c'est la fonction analyseExpression(char* &s) qui au passage fait un passage par pointeur et référence. Si ce n'est pas toi qui a codé ça, ok il faut faire avec. Mais un tel passage veux dire que tu risques de modifier carément le pointeur (et pas forcément ce qu'il pointe) dans la fonction. Si c'est bien le cas, cela veux dire que faire un cast risque de modifier une chaine constante (ou du moins tenté) ce qui devrait crasher ton programme.
La façon propre de faire ici est la suivante :
const char *tmp=expr.toStdString().c_str();
char *ex=new char[strlen(tmp)+1];
strcpy(ex,tmp);
e=analyseExpression(ex);
delete [] ex;// bien penser à supprimer une variable allouée dynamiquement : 1 new<-> 1 delete 

Comme ça, quoi que fasse la fonction analyseExpression, tu ne prends pas de risque avec la mémoire et tes valeurs.
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
Modifié par linkcr15 le 26/01/2012 à 12:52
Je sais Char Snipeur, le code vient bien de moi et ceci est fait exprès. Le but de analyse fonction déplace le pointeur à chaque fois qu'un caractère est analyser. Tu as déjà vu un code qui permet d'analyser une expression arithmétique peut-être? ^^ Ne t'inquiète pas, ceci est mon code est le déplacement du pointeur est fait exprès. Je vais tester ton code Char Snipeur car c'est vrai que j'ai quelques bugs avec ma méthode (notamment des chiffres et lettres bizarres devant l'affichage de mon expression à la sortir de analyseExpression comme : y] par exemple, le y étant constant et ce qu'il y a après varie....

EDIT : Ton code marche Char Snipeur, merci de m'avoir aidé. Cependant j'ai toujours les chiffres et lettres bizarres devant mon expression, même si le y est partit...
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
26 janv. 2012 à 14:18
je n'ai pas trop compris ton argument de déplacement de pointeur. Montre donc ta fonction analyseExpression, mais à mon avis le prototype n'est pas bon.
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
26 janv. 2012 à 21:41
Expression* analyseExpression(char* &s)
{
Expression* g= analyseTerme(s);
mangeblanc(s);
if (s[0]=='+')
{
++s; Expression* d=analyseExpression(s); // ou return new Plus(g,analyseExpression(++s);
return new Plus(g,d);
}
else
if(s[0]=='-')
{
Expression* d=analyseExpression(s); // ou return new Plus(g,analyseExpression(++s);
return new Plus(g,d);
}
else
{
return g;
}
}

Voici mon analyse expression.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
27 janv. 2012 à 08:15
Tu n'as pas besoin de passer la référence pour incrémenter ton pointeur. La différence, c'est que la modification ne sera pas conservé au retour, mais tel que tu écris ça ne devrais pas poser de problème.
0