Warning: deprecated conversion from string constant to ‘char*’ [Résolu]

flateur18 36 Messages postés vendredi 12 février 2010Date d'inscription 4 décembre 2014 Dernière intervention - 19 nov. 2009 à 13:55 - Dernière réponse : cptpingu 3789 Messages postés dimanche 12 décembre 2004Date d'inscription 25 mai 2018 Dernière intervention
- 20 nov. 2009 à 15:51
Bonjour à tous,

j'ai réalisé un programme gcc qui se compile parfaitement, or j'ai des "warning" que je souhaiterais supprimer.

celui qui m'énerve mad le plus (façon de parler big_smile) c'est :

15 : warning: deprecated conversion from string constant to ‘char*’

ma ligne de code est :


Code:

char *test[4] = { "A1", "A2", "A3", NULL };



j'ai compris (à priori) que ma fonction demande un pointeur vers un char non constant,
j'ai donc essayé de faire :


Code:
[b]
const char *test[4] = { "A1", "A2", "A3", NULL };/b



et là mon programme ne se compile plus yikes


Quelqu'un peut m'aider à enlever le warning svp !!!

Merci d'avance
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
flateur18 36 Messages postés vendredi 12 février 2010Date d'inscription 4 décembre 2014 Dernière intervention - 20 nov. 2009 à 10:26
3
Merci
J'ai trouvé !!!

il faut utiliser le tableau de "const char *".

Tel quel ça provoque une erreur à la compilation (conversion de "const char **" à "char **" impossible).

Pour résoudre ceci, j'ai utilisé un "const_cast<char**>(test)" à la place de test dans l'appel de fonction.

const char *test[4] = { "A1", "A2", "A3", NULL };

Mon_bouton =
    new puButtonBox (10, 90, 10, 15, const_cast<char**>(test), TRUE); 


et là plus de warning et je compile.


Merci à tous

Merci flateur18 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de flateur18
cptpingu 3789 Messages postés dimanche 12 décembre 2004Date d'inscription 25 mai 2018 Dernière intervention - 19 nov. 2009 à 14:56
0
Merci
En preneur le code suivant: (0 au lieu de NULL pour éviter un include):

int main(void)
{
  const char *test[4] = { "A1", "A2", "A3", 0 };

  return 0;
}


Ligne de compilation (Je ne sais pas si c'est du C ou du C++)

C:
gcc -W -Wall -ansi -pedantic test.c

Tout fonctionne (à part un warning normal parce que je n'utilise pas la variable "test")

C++:
g++ -W -Wall -Wabi -pedantic test.cc

Tout fonctionne (à part un warning normal parce que je n'utilise pas la variable "test")

Quel est la version de ton gcc ? Peux-tu tester la même chose que moi ?
Commenter la réponse de cptpingu
flateur18 36 Messages postés vendredi 12 février 2010Date d'inscription 4 décembre 2014 Dernière intervention - 19 nov. 2009 à 15:36
0
Merci
Merci pour ta réponse

j'ai le gcc4.3

et mon fichier est .cpp je ne peux malheureusement pas le changer en .c car on travail en groupe.

j'ai essayé ta manip, mais j'ai toujours le warning et maintenant avec une erreur qui le laisse pas compiler
Commenter la réponse de flateur18
cptpingu 3789 Messages postés dimanche 12 décembre 2004Date d'inscription 25 mai 2018 Dernière intervention - 19 nov. 2009 à 15:45
0
Merci
j'ai le gcc4.3

De même, j'ai gcc4.3.3

et mon fichier est .cpp

L'extension du fichier n'a pas d'importance. J'en déduis que tu fais du C++.

j'ai essayé ta manip, mais j'ai toujours le warning et maintenant avec une erreur qui le laisse pas compiler

Qu'as tu essayé, exactement ?
Peux tu mettres le code ci-dessous dans un fichier:
#include 

int main(void)
{
  const char *test[4] = { "A1", "A2", "A3", 0 };

  for (int i = 0; i < 4; ++i)
    std::cout << test[i] << std::endl;

  return 0;
}


Et le compiler comme ceci:

g++ -W -Wall -Wabi -ansi -pedantic TONFICHIER


Dis moi si ce simple fichier est correctement compilé.
Commenter la réponse de cptpingu
flateur18 36 Messages postés vendredi 12 février 2010Date d'inscription 4 décembre 2014 Dernière intervention - 19 nov. 2009 à 16:54
0
Merci
oui ce simple fichier est compilé.

ce que j'ai essayé :

#include 

const char *test[4] =
  { "xxxxxxxx", "yyyyyyyyyyyyy", "zzzzzzzzzz", 0 };
for (int i = 0; i < 4; ++i)
    std::cout << test[i] << std::endl;


J'explique plus profondément : ce qui est dans test[] est censé être utilisé comme paramètres pour un ButtonBox que je crée par la suite.
j'écris:

const char *test[4] =
  { "xxxxxxxx", "yyyyyyyyyyyyy", "zzzzzzzzzz", 0 };

Mon_bouton =
    new puButtonBox (10, 90, 10, 15, test, TRUE);


test contient les labels à mettre.

Avec ta suggéstion j'ai fait :

const char *test[4] =
  { "xxxxxxxx", "yyyyyyyyyyyyy", "zzzzzzzzzz", 0 };

for (int i = 0; i < 4; ++i)
    std::cout << test[i] << std::endl;

Mon_bouton =
    new puButtonBox (10, 90, 10, 15, test, TRUE);


mais j'arrive pas à compiler comme ça.

Merci pour ton interrêt
Commenter la réponse de flateur18
cptpingu 3789 Messages postés dimanche 12 décembre 2004Date d'inscription 25 mai 2018 Dernière intervention - 19 nov. 2009 à 17:02
0
Merci
new puButtonBox (10, 90, 10, 15, test, TRUE)

Je comprends déjà mieux le problème.
Peux-tu me faire voir le prototype du constructeur de "puButtonBox()" ?
Je suis à peu près sur que le 5ème arguments attends un "char*[]" et non un "const char *[]". Si c'est une classe à toi, ajoute le "const" dans le constructeur de ta classe, surtout si tu n'as pas vocation à modifier les éléments du tableaux.


là mon programme ne se compile plus yikes

Quelle est l'erreur ? (Copie pas pas tout, juste ce qui est intéressant).
Commenter la réponse de cptpingu
flateur18 36 Messages postés vendredi 12 février 2010Date d'inscription 4 décembre 2014 Dernière intervention - 19 nov. 2009 à 17:20
0
Merci
Prototype du constructeur:

puButtonBox my_box =  new puButtonBox ( x1, x2, y1, y2, labels, <0|1> ) ;


labels = "char*[]" en effet.

je rappel que je veux juste enlever le warning :

warning: deprecated conversion from string constant to ‘char*’

mon programme ne compile plus quand je fais :

const char *test[4]  = { "A1", "A2", "A3", NULL }; 


l'erreur est :

error: no matching function for call to ‘puButtonBox::puButtonBox(int, int, int, int, const char* [4], int)’
/usr/include/plib/pu.h:1488: note: candidates are: puButtonBox::puButtonBox(int, int, int, int, char**, int) <near match>
/usr/include/plib/pu.h:1478: note: puButtonBox::puButtonBox(const puButtonBox&)
Commenter la réponse de flateur18
flateur18 36 Messages postés vendredi 12 février 2010Date d'inscription 4 décembre 2014 Dernière intervention - 19 nov. 2009 à 17:27
0
Merci
Prototype du constructeur:

puButtonBox my_box =  new puButtonBox ( x1, x2, y1, y2, labels, <0|1> ) ;


labels = "char*[]" en effet.

je rappel que je veux juste enlever le warning :

warning: deprecated conversion from string constant to ‘char*’

mon programme ne compile plus quand je fais :

const char *test[4]  = { "A1", "A2", "A3", NULL }; 


l'erreur est :

error: no matching function for call to ‘puButtonBox::puButtonBox(int, int, int, int, const char* [4], int)’
/usr/include/plib/pu.h:1488: note: candidates are: puButtonBox::puButtonBox(int, int, int, int, char**, int) <near match>
/usr/include/plib/pu.h:1478: note: puButtonBox::puButtonBox(const puButtonBox&)
Commenter la réponse de flateur18
cptpingu 3789 Messages postés dimanche 12 décembre 2004Date d'inscription 25 mai 2018 Dernière intervention - 19 nov. 2009 à 17:36
0
Merci
puButtonBox my_box = new puButtonBox ( x1, x2, y1, y2, labels, <0|1> ) ;


Mais c'est pas ça un prototype ! C'est la déclaration si tu préfères.

error: no matching function for call to ‘puButtonBox::puButtonBox(int, int, int, int, const char* [4], int)’
/usr/include/plib/pu.h:1488: note: candidates are: puButtonBox::puButtonBox(int, int, int, int, char**, int) <near match>
/usr/include/plib/pu.h:1478: note: puButtonBox::puButtonBox(const puButtonBox&)


D'après l'erreur: j'en déduis que ton prototype est:
puButtonBox(int, int, int, int, char**, int)


Or tu ne lui passes pas un "char**", mais un "const char* [4]". D'où l'erreur. Pour corriger cela, change le prototype par:
puButtonBox(int, int, int, int, const char**, int)


gcc te fait un warning parce que tu fais quelque chose de dangereux: tu passes des chaînes en dur, à une fonction/méthode qui à le droit de modifier celle-ci.
Commenter la réponse de cptpingu
cptpingu 3789 Messages postés dimanche 12 décembre 2004Date d'inscription 25 mai 2018 Dernière intervention - 20 nov. 2009 à 10:32
0
Merci
Pour résoudre ceci, j'ai utilisé un "const_cast<char**>(test)" à la place de test dans l'appel de fonction.


Ah mais non !!! Surtout pas !
Je t'explique: g++ te fait un warning pour te prévenir d'une action dangereuse de ta part (passage d'un const à une méthode qui veut du non const, et donc qui pourrait modifier une zone read-only).
Tu n'as pas résolu le problème. Tu as forcé le compilateur à ne pas t'afficher le warning. Le problème est toujours présent.
Dans le constructeur de puButtonBox, tu peux potentiellement modifier "test", ce qui ne devrait pas être autorisé. La solution est plus simple que cela, je te l'ai déjà donné: Mettre un const dans le prototype du constructeur "puButtonBox".

D'une manière générale, si tu te retrouves à utiliser const_cast, pose toi de sérieuses questions sur la qualité de ton code.
Commenter la réponse de cptpingu
flateur18 36 Messages postés vendredi 12 février 2010Date d'inscription 4 décembre 2014 Dernière intervention - 20 nov. 2009 à 14:03
0
Merci
Non, c_str() est censé retourner un "const char*". Donc on tourne en rond. Et de plus ce n'est pas "char *" qu'attend le constructeur, mais un "char **".

Je reconnais volontier que le const_cast n'est pas ce qui ce fait de plus beau.

Donc il reste la solution de copier les chaînes "const" dans des éléments alloués dynamiquement et non-const. (un travail d'ouvrier car j'ai plus de 500 ligne à modifier - et c'est ce que j'essayais d'éviter depuis le début )
Commenter la réponse de flateur18
cptpingu 3789 Messages postés dimanche 12 décembre 2004Date d'inscription 25 mai 2018 Dernière intervention - 20 nov. 2009 à 14:41
0
Merci
Non, c_str() est censé retourner un "const char*". Donc on tourne en rond. Et de plus ce n'est pas "char *" qu'attend le constructeur, mais un "char **".


Quelle rapport avec c_str() et un tableau de chaines de caractères (cf variable test) ?

Je reconnais volontier que le const_cast n'est pas ce qui ce fait de plus beau.

Mieux vaut laisser le warning dans ce cas, au moins l'erreur n'est pas masquée (parce que ça revient à ignorer l'erreur).

Pourquoi ne pas changer le constructeur de puButtonBox ?
Je peux voir un peu plus de code, en rapport avec cela ? (juste quelques extraits).
Commenter la réponse de cptpingu
flateur18 36 Messages postés vendredi 12 février 2010Date d'inscription 4 décembre 2014 Dernière intervention - 20 nov. 2009 à 15:22
0
Merci
voici une partie de mon code:

const char *test1[4] =
  { "Kalman", "Runge Kutta", "Euler", 0 };

const char *test2[3] =
  { "Capteurs US", "GPS", 0 };

GGP1 = new puButtonBox (10, 90, 10, 15, const_cast <char**>(test1), TRUE);

 GGP2 = new puButtonBox (10, 70, 10, 15, const_cast <char**>(test2), TRUE);


comment pourrai-je faire la méthode c_str()?
car je ne sais pas du tout comment m'y prendre (j'ai pas l'habitude)

merci encore
Commenter la réponse de flateur18
cptpingu 3789 Messages postés dimanche 12 décembre 2004Date d'inscription 25 mai 2018 Dernière intervention - 20 nov. 2009 à 15:51
0
Merci
Je réitère ma question: Pourquoi ne pas changer le constructeur de puButtonBox ?
Peux-tu me faire voir le code du constructeur de puButtonBox ?
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.