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 :

const char+string+const char == error. // Probleme de sytaxe ou de compilateur?


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut const char+string+const char == error. // Probleme de sytaxe ou de compilateur?
    Bonjour,
    je fourni a une fonction une chaine de caractère (une url) en paramètre, qui doit être sous forme de char*.

    J'ai deux location, donc deux ip, donc dans mon code j'ai placer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fonction("http:\\"+location+"\xxx")
    C'est alors que code block avec MinGW me sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: cannot pass objects of non-POD type `struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >' through `...'; call will abort at runtime|
    Et effectivement, ca passe pas.
    Alors qu'il me semble que sous dev-cpp je faisais la même chose et que ca marcher tres bien.
    J'ai un peus jongler avec les type de données, même que totalement désespère j'y suis aller a coup de c_str(), mais ca ne voulait même plus se compiler. (normale )

    Quelqu'un pourrait m'éclairer.

    Merci

  2. #2
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 38
    Points : 52
    Points
    52
    Par défaut
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string prout("http://" + location + "\xFF"); //Remplace FF par quelque chose en hexadécimal
    fonction(prout.c_str());

  3. #3
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    Citation Envoyé par raphamil Voir le message
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string prout("http://" + location + "\xFF"); //Remplace FF par quelque chose en hexadécimal
    fonction(prout.c_str());
    C'est pas mieux tu ajoutes toujours des pointeurs
    Tu peux faire ça par exemple:
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::string prout("http://");
    prout += location;
    prout += ...;
    fonction(prout.c_str());

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Le message d'erreur est pourtant clair.
    Tu passes un objet de type std::string à une fonction à nombre d'arguments variable, ce qui n'est pas autorisé (en effet, on ne peut passer que des PODs à ce genre de fonctions).
    Boost ftw

  5. #5
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 38
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Twindruff Voir le message
    C'est pas mieux tu ajoutes toujours des pointeurs
    Tu peux faire ça par exemple:
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::string prout("http://");
    prout += location;
    prout += ...;
    fonction(prout.c_str());
    Et alors ?
    En quoi ce n'est pas bien ?

  6. #6
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    Ben faire la somme de deux adresses absolues ça n'a pas de sens.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {
        const char *a = "abc";
        const char *b = "def";
     
        const char *c = a + b;
    }
    c ne pointe pas vers une chaine qui serait "abcdef", mais c contient la somme des deux adresse contenues dans a et b. Donc quelque chose d'inconnu. Le + c'est bien la somme et pas la concaténation.

  7. #7
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Si vous lui expliquez comme ça, il va rien comprendre le pauvre…

    Version courte :

    Pour pouvoir concaténer des chaines de caractères, il faut t'assurer que le premier opérande soit de type std::string. Pour cela, tu peux effectuer une conversion explicite en appelant le constructeur de std::string qui prend un const char* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    url = std::string("http://") + location + "/xxx";
    En effet, la concaténation de chaines à l'aide de l'opérateur + ne fonctionne pas avec les chaines littérales seules (de type const char*).
    Faire cela revient à additionner des pointeurs, ce qui n'est pas du tout ce que tu cherches à faire.

    L'opérateur + est surchargé pour le type std::string, ce qui te permet de concaténer facilement des chaines de ce type. La seule condition, c'est que le premier opérande soit de type std::string.

    C'est donc un problème de sémantique (pas syntaxe) et non de compilateur.




    Ensuite, pour convertir en const char* :

    Autre chose : tu as des « \ » dans tes chaines de caractères, alors que les url contiennent des « / » uniquement.
    Attention, en C (et dans tous les langages de la même famille) « \ » est un caractère spécial dans les chaines littérales.
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  8. #8
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    lol Florian GOO,
    je retien .c_str();

    Je devait etre fatiguer, car je savais que ca passerai, mais je ne sais plus trop pourquoi je ne voulais pas declarer de nouvelle variable.

    [comme je ne peu pas avoir de changement de location en cours d'execution >
    1 choix de location
    2 string a = "http:\\"+location] //déclaration avant le main, ou en def
    3 loc = location+ce_dont_g_besoin_sur_le_moment
    4 fonction(param, ..., loc.c_str() );

    oui, ce qui m'enbaiter c'ete d'avoir une ligne de plus pour chaque url apeller.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2004
    Messages : 30
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Florian Goo Voir le message
    L'opérateur + est surchargé pour le type std::string, ce qui te permet de concaténer facilement des chaines de ce type. La seule condition, c'est que le premier opérande soit de type std::string.
    Le premier opérande d'un opérateur peut ne pas être un objet s'il est définit par une fonction (pas par une méthode). Tu peux donc rajouter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    string operator + (const char* c, const string& s) {
      return string(c) + s;
    }
     
    int main() {
      string s = "bar";
      string t = "foo " + s; // ok
    }

  10. #10
    screetch
    Invité(e)
    Par défaut
    l'operateur + marche tres bien, cessez de l'embrouiller

    raphamil avait donné tout de suite la bonne réponse!!

  11. #11
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    Heu non ça compile pas ça hein
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	char *location = "abc";
    	std::string prout("http://" + location + "\xFF");

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Certes, mais ce code fonctionne parfaitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        string location = "developpez.net";
        string s = "http://" + location + "/forums";
    le warning n'est pas lié à ça, mais à autre chose. Il passe une std::string à une fonction de type printf (cf message de loufoque).

  13. #13
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    Ça marche si location est un string mais pas si c'est un char*. Les messages précédents ne disent pas son type je crois

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/03/2011, 17h14
  2. conversion const std::string et const char * ?
    Par panthere noire dans le forum C++
    Réponses: 7
    Dernier message: 28/02/2011, 15h51
  3. Réponses: 2
    Dernier message: 03/04/2009, 17h46
  4. Convertir un const unsigned char * à string
    Par anas.eh dans le forum C++
    Réponses: 4
    Dernier message: 04/08/2008, 22h40
  5. [C++] string -> const char*
    Par lOeil dans le forum C++
    Réponses: 20
    Dernier message: 26/12/2006, 03h04

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