IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

C++ attention:deprecated conversion from string constant to 'char*'


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 106
    Points : 31
    Points
    31
    Par défaut C++ attention:deprecated conversion from string constant to 'char*'
    Bonjour a tous,

    je viens vers vous après plusieurs recherche sur le net mais sans sucées.

    voila j'essaye d’exécuter un programme avec code blocks, et je me retrouve avec plusieurs message d'erreur dans mon main du type
    Code cmd : Sélectionner tout - Visualiser dans une fenêtre à part
    attention : deprecated conversion from string constant to 'char*' [-Wwrite-strings]

    les lignes qui me font les erreurs contiennent tous le NEW, exemple ci-dessous :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
     sRHO = new Block("RO");
    je déclare bien
    et dans mon fichier Block.cpp je déclare comme suite:
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "Block.h"
    Block::Block( char *name, Bank *b) : BlockPP(name, b)
    {   
        B = 3;
        Text = ID;
        strcpy(address.name,name);
    }

    auriez vous une idée sur ce qui coince ?
    est ce que cela est due au linkage et que j'ai mal configuré le code blocks,
    ou c'est une erreur de syntaxe ...

    merci de votre aide

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Toutes les chaînes "aeddde" sont stockées dans le data segment, on ne doit donc pas pouvoir les modifier, il faut alors faire const char * c = "aeddde" ou void foo(const char * c);.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 106
    Points : 31
    Points
    31
    Par défaut
    Merci Neckara pour ta réponse,

    je n'ai pas bien compris ta réponse, que ce que tu veux dire avec "aeddde", et la ligne
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const char * c = "aeddde" 
     void foo(const char * c)
    je doit la mettre a quelle niveau.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par bforzeus Voir le message
    Merci Neckara pour ta réponse,

    je n'ai pas bien compris ta réponse, que ce que tu veux dire avec "aeddde", et la ligne
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const char * c = "aeddde" 
     void foo(const char * c)
    je doit la mettre a quelle niveau.
    A ta ligne sRHO = new Block("RO");, tu lui donne une chaîne constante, il faut donc que le constructeur de Block prenne en paramètre un const char * ou un const std::string &

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 106
    Points : 31
    Points
    31
    Par défaut
    j'ai modifier le constructeur de la façon suivante :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "Block.h"
    Block::Block( const char *name, Bank *b) : BlockPP(name, b)
    {   
        B = 3;
        Text = ID;
        strcpy(address.name,name);
    }

    mais j'ai toujours les même erreurs.
    Code cmd : Sélectionner tout - Visualiser dans une fenêtre à part
    attention : deprecated conversion from string constant to 'char*' [-Wwrite-strings]
    saurai tu pour quoi, n'y a til pas d'autre moins de contourné le probleme

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    BlockPP(name, b) => as-tu pensé à modifier aussi le constructeur de BlockPP ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 106
    Points : 31
    Points
    31
    Par défaut
    Oui, j'ai modifier le blockpp.cpp comme suite :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BlockPP::BlockPP(const char *n, bank *b) 
    {  b = b;
        d = d;
    }
    et j'ai toujours la même erreur

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 106
    Points : 31
    Points
    31
    Par défaut
    tu sais pas s'il ya un autre moyen pour contourné cette problématique des
    Code cmd : Sélectionner tout - Visualiser dans une fenêtre à part
    attention : deprecated conversion from string constant to 'char*' [-Wwrite-strings]

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Attention, l'affectation n'est pas l'initialisation.
    Lors d'un construction d'une variable d'un type donné, il y a plusieurs phases:
    • allocation de la mémoire: par le compilateur ou un new
    • initialisation de la mémoire
    • exécution du constructeur a proprement parler


    L'allocation n'est pas du ressort de la classe, mais les autres étapes si.
    Pour ce faire, on utilise les constructeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class C {
    private:
        int n;
    public:
        C(int value) : n(value) { std::cout <<n<<std::endl;}
    };
    La partie entre les accolades est le corps du constructeur, appelé une fois la variable initialisée.
    La partie juste après le ':', bien qu'optionnelle, est composée d'appels aux constructeurs des membres et classes parentes (ou des (grands-)parents virtuels).
    Chaque membre non explicitement construit est construit via un constructeur par défaut.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 106
    Points : 31
    Points
    31
    Par défaut
    j'ai bien déclaré mon constructeur, sauf que l'appelle a ce dernier avec une chaine de caractère constante qui pose probleme, et je comprend vraiment pas pourquoi

  11. #11
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    De quel type est ton address.nameJ'ai l'impression que tu essaies de faire quelque chose de pas joli joli avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(address.name,name);
    là ou un simple address.name = name, si tant est que address.name est bien un std::string
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 106
    Points : 31
    Points
    31
    Par défaut
    elle est bien de type std::string.
    je pense pas que mon probleme viens de la,
    parce que j'ai plusieurs erreur de ce type et dans les autre classe je fais des appelle simple.
    le seul point en commun c'est que les fonction qui coince c'est les constructeur avec un char, et moi je fais appelle a eux avec des chaine de caractère dans mon main.
    je ne voix vraiment pas ce qui dérange de faire appelle avec une chaine de caractère constante

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    le problème est stipulé plus haut : les chaînes "en dur" dans le code sont des const char* définis particulièrement dans l'exécutable, le data_segment.
    Si une méthode demande un char* et non un const char*, rien n'assure qu'elle ne modifie pas ce paramètre. Puisqu'il n'est pas constant.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 106
    Points : 31
    Points
    31
    Par défaut
    merci a tous,

    c’était bien ça le probleme, j'ai oublier de mettre le const char* dans le fichier .h, maintenant c'est nikel.
    SOl:
    il faut remplacer char* par const char* dans le .cpp et .h

    ca fais plaisir de voir qu'il y a moins d'erreurs et de warning dans son programme

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/05/2010, 08h58
  2. Réponses: 2
    Dernier message: 08/12/2009, 12h57
  3. Réponses: 2
    Dernier message: 18/02/2009, 13h30
  4. Conversion error from string "15-AUG-2008"
    Par freud dans le forum SQL
    Réponses: 2
    Dernier message: 17/08/2008, 19h24
  5. error: invalid conversion from `const wxChar*' to `CHAR*'
    Par barbarello dans le forum wxWidgets
    Réponses: 16
    Dernier message: 31/01/2006, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo