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

Langage C++ Discussion :

Copie de string


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Copie de string
    Bonjour,

    quelqu'un peut-il m'indiquer l'instruction pour charger le résultat (texte) de l'instruction "cin" dans une variable AppName déclarée comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ESS_TSA_API_typedef (char *,          ESS_STR_T);
    ESS_STR_T       AppName;
    Pas simple au départ la manipulation des string et des pointeurs associés !

    L'environnement c'est : windows/qt5/mingw mais ça ne doit pas changer grand-chose.

    Merci à tous

  2. #2
    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
    Là, concretement, tu as écris:
    C'est un pointeur sans rien au bout. C'est normal que ca ne fonctionne pas.

    essaie par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::string temp;
    cin>>temp;
    ESS_STR_T AppName = new char[temp.size()+1];
    strncpy(AppName, temp.c_str(), temp.size()+1);
    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

  3. #3
    Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut C'est Ok
    Merci. Maintenant je comprends pourquoi ça plantait quand j'utilisais AppName en tant que pointeur.

    J'ai modifié un peu le code puisque AppName était déjà déclaré dans l'include de l'API :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cin>>temp;
    AppName = new char[temp.size()+1];
    strncpy(AppName, temp.c_str(), temp.size()+1);
    Ce qui était troublant c'est que si j'écris AppName="titi" ça marche sans problème

  4. #4
    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
    C'est parce qu'un littéral de chaine de caractère (n'importe quoi entre double quote, par exemple "titi") est un const char*.

    Il n'existe pas de type primitif de chaine de caractère.
    Seulement des char[] (et char const []) et des std::string qui utilisent en interne la première solution.

    "titi" est une valeur constante affectable à un char const[], et donc convertible en char const*.
    C'est aussi une valeur convertible en std::string, car celle ci possède un constructeur de conversion non-explicite (std::string(char const*);)

    Du coup, effectivement, char const *that = "titi"; est un code valide.
    Cela dit, comme "titi" est conservé dans une mémoire protégée (directement prise dans le binaire compilé), ce n'est pas normalement assignable à un char *that = "titi";.
    Un compilateur tel que gcc/g++ se plaindra.
    Citation Envoyé par g++
    warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    D'ailleurs, tu devrais toujours compiler avec un maximum de warning. Pour g++, il vaut mieux utiliser -Wall -Wextra, et considérer que chaque warning est probablement une faute.
    En mode paranoïaque, je rajoute -Werror, pour faire échouer la compilation au moindre warning.
    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

  5. #5
    Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Copie de string
    Encore merci.

    Je pense que j'ai les bonnes options de compilation (options par défaut). Des warning de ce type j'en ai pas mal. J'essaye de vivre en bonne intelligence avec eux

    Ca ne m'inquiète pas trop que certaines conversions de type soient prises en charge par le compilateur mais c'est toujours intéressant qu'il nous prévienne de ce qu'il assume !

  6. #6
    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
    Un warning n'est pas un simple message, c'est un avertissement du compilateur, qui pense que tu fais probablement une erreur, mais qui peut s'en sortir comme ca dans certains cas.

    En fait, ces warnings sont graves.
    Si tu tentes de modifier un quelconque caractères d'une chaine littérale, cela provoquera une segmentation fault.
    Exactement comme accéder à NULL, et pour (quasiment) la même raison.

    Un de mes anciens employeurs à perdu plusieurs milliers d'euros à cause d'une telle erreur.
    En effet, les deux développeurs encore en charge de l'application ont passé plus d'un moins à traquer un bug, parce qu'ils avaient désactivé ce warning précis.

    Prends une bonne habitude: un warning est probablement une faute.
    L'avantage de cette attitude, c'est que ton code sera toujours meilleur.
    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

  7. #7
    Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Ok je vais continuer mon dev (un petit outil d'exploit). A un moment je m'attaquerai aux warnings mais souvent en essayant d'en éliminer un j'en génère un autre !

  8. #8
    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
    Euh... tu devrais prendre le problème à l'autre bout.

    Commence par rendre un maximum de chose const. Tout particulièrement les pointeurs.

    Chaque fois que ca crée de nouveaux warnings ou erreurs de conversions, propage le const.

    En fait, tu as une arborescence de warnings, et le compilateur ne vois que les racines.
    Les warnings qui apparaissent en corrigeant les racines étaient déjà présent, mais comme tu passais d'un mauvais type au même mauvais type, le compilateur ne les voyait pas. Maintenant que le type source est bon, il râle.

    Tu sauras si c'était des simples warnings ou de vraies fautes si tu as autre chose à faire que rajouter des const aux déclarations de paramètres ou variables.

    Il faut le faire le plus tôt possible, pour éviter d'avoir à le faire plus tard.
    Pour certains cas, il va peut-être falloir modifier un peu la structure du code, et plus tu le feras tôt, moins tu en auras à faire.

    Je t'assure que de "continuer comme ça", ça va finir par te faire très mal.

    Et puis il y a le plaisir de coder proprement.
    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

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

Discussions similaires

  1. Copie de String Avec Accents ou Apostrophe
    Par progamer54 dans le forum Langage
    Réponses: 3
    Dernier message: 30/10/2007, 10h40
  2. Copy String to array of char
    Par Ardely dans le forum Delphi
    Réponses: 11
    Dernier message: 11/02/2007, 00h24
  3. [POO] Objet string et copie
    Par Gruik dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/11/2006, 17h34
  4. copie de string donne une chaine vide
    Par zmatz dans le forum SL & STL
    Réponses: 5
    Dernier message: 15/10/2005, 15h31
  5. Problème de copie de string dans string
    Par kazarn dans le forum SL & STL
    Réponses: 17
    Dernier message: 15/03/2005, 18h35

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