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
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
A voir également:
- Qstring en char* (et non const char*)
- Coco char - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Coco chat connexion sur mobile, le tchat est fermé ? ✓ - Forum Réseaux sociaux
- Site coco chat (incitation a payer) ✓ - Forum Vos droits sur internet
- If char ✓ - Forum Programmation
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
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é :
?
Cdlt,
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,
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
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é!
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é!
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
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 :
Comme ça, quoi que fasse la fonction analyseExpression, tu ne prends pas de risque avec la mémoire et tes valeurs.
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.
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
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...
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...
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
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.
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
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.
{
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.
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
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.