Qstring en char* (et non const char*) [Résolu/Fermé]

Signaler
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
-
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
-
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

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 751
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,
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
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é!
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 279
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.
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
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...
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 279
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.
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
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.
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 279
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.