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

Qt Discussion :

QString data(), appel mauvaise fonction


Sujet :

Qt

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut QString data(), appel mauvaise fonction
    Bonjour à tous,

    Afin de transformer un QString en "char*", j'ai utilisé la fonction QString::data(), afin d'obtenir un "QChar*";
    Cependant, il existe deux définitions de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QChar * QString::data ()
    const QChar * QString::data () const
    Quand j'appelle la fonction data, le compilateur/linker utilise la deuxième définition, et veut me renvoyer un "const QChar*", alors que c'est la première que je veux.

    Ce que je trouve débile, c'est qu'il existe une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const QChar * QString::constData () const
    qui réalise exactement la même fonction que la deuxième définition de data().

    Je voulais donc savoir qu'elle méthode je pouvais utiliser pour que mon compilateur utilise la bonne fonction data(). J'utilise le compilateur de VS 2008 express, sur XP SP2. (configure de Qt : -platform win32-MSVC2008 ).

    Sinon, avez vous une meilleure méthode pour passer d'un QString à un char* ? J'ai essayé de passer par un std::string, mais ce dernier n'offre que la possibilité de récupérer un const char* . Ou alors, il faut que je recré mon char * en faisant une copie caractère par caractère de mon const char *. Mais c'est plus lourd.

    Merci d'avance pour vos remarques,

    G.

  2. #2
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Il faut savoir ce que tu en fais... Le compilateur infère la signature qui correspond à l'utilisation que tu fais/type dans lequel tu vas mettre ta variable.

    Il faudrait que tu nous montre ton code, car c'est là qu'il y a un problème.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Gulish Voir le message
    Ce que je trouve débile, c'est qu'il existe une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const QChar * QString::constData () const
    qui réalise exactement la même fonction que la deuxième définition de data().
    Et pourtant c'est l'une des propriété les plus intéressante et performante de Qt!!!!!! puisqu'elle ne font justement pas la même chose!!!!!!!

    pourquoi Je te laisse regarde ces quelques pages
    http://qt.developpez.com/doc/4.4/qsh...inter/#details
    http://qt.developpez.com/doc/4.4/qex...eddatapointer/
    http://qt.developpez.com/doc/4.4/sha...licitly-shared

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    J'ai réussi. Je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QChar * qBuffer = monQString.data();
    Ca ne marchait pas, mais en ajoutant un cast devant, ça a résolu ce problème. Je suppose que le cast permettait au compilateur de reconnaître la bonne signature, comme tu l'a dis.

    Cependant, finalement, je me suis orienté vers autre chose pour passer de QString à char*. Mais comme souvent, autre méthode, autre problème.

    Pour faire cela, je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    QString monString("blabla");
    std::string str= monString.toStdString();
    //puis j'utilise la méthode donnée dans la FAQ C++
    size_t size = str.size() + 1;
    char * buffer = new char[ size ];
    strncpy( buffer, str.c_str(), size );
    qDebug()<< buffer;
    (...)
    delete [] buffer;
    Quand je fais ça dans un main, pour tester, tout va bien, j'arrive à créer mon char* sans problème. Par contre, dès que j'essaie de le mettre dans mon appli, j'obtiens une exception à l'éxécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception non gérée à 0x004afb34 dans monAppli.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x65766974.
    Le point d'arrêt se situe au niveau du strncpy.

    Je comprends vraiment pas pourquoi ça marche pas ...

    Si vous avez des idées ...

    G.

  5. #5
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Tu alambiques un peu trop tes solutions :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QString s("toto");
    char *chars = new char[s.size()];
    strncpy(chars, s.data(), s.size());
    qDebug(chars); // <= "toto"

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Je ne savais pas que strncpy prenait const QChar* en argument ...

    Peut être que j'alambique, mais ça m'évite d'oublier des étapes...

  7. #7
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Oups, non pardon, je me suis planté, mea culpa!

    Tu pourrais donner plus de détails sur ton code stp ? (celui qui crash)
    C'est réparti en plusieurs fonctions ?

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Des détails, et bien ...

    Disons que j'ai une QStringList d'environ 180 éléments, je dois convertir chaque QString en un char* pour passer cette chaîne en argument d'une fonction (qui vient d'une DLL codée en C).

    Pour l'instant, j'aimerais juste convertir cette QStringList en une liste de char*, mais j'ai vraiment un problème lors de la conversion. Ce n'est plus un problème de type, mais plutôt d'accès à la mémoire.

    Le bout de code que j'ai mis est vraiment celui que j'utilise, et j'arrive à faire fonctionner ce code dans un projet bidon. Pour l'instant, j'essaie juste de convertir une seule chaîne,mais ça ne veut pas.

    Existe t'il des équivalents de strncpy, peut être un peu plus "safe" ?

    Ou alors c'est mon allocation mémoire de mon pointeur de char. Un malloc serait mieux ?

    Merci encore,

    G.

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut? Si tu utilise le code que tu nous montre :
    1-strcpy suffit largement
    2- l'erreur ne viens surement pas de la, tu doit faire une erreur mémoire ailleurs. Vive les erreurs mémoire

    Peut tu mettre le code de la fonction où tu utilise ce bout de code??

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Bien qu'il ne soit plus tout frais, je termine ce post.

    J'ai donc enfin trouvé une solution différente à mon problème.
    La méthode QString->std::string->char* ne fonctionne toujours pas, il y'a un problème lors de la conversion std::string->char*.

    J'ai donc utilisé un autre chemin pour parvenir à mon objectif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QByteArray monQTab= monQString.toAscii();
    char buffer[x];//on crée un tableau de char, la taille peut être celle de monQTab
     
    for(int i =0;i<x-2;i++) // on copie les caractères un à un
       buffer[i]=monQTab[i];
     
    buffer[x-1]=0;//un char * étant une suite de char terminée par 0;
    Ce système est un peu archaïque, mais ça marche, et finalement, dans mon cas, j'y ai trouvé d'autres avantages.

    G.

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

Discussions similaires

  1. QString en appel de fonction
    Par hichamo4 dans le forum Qt
    Réponses: 3
    Dernier message: 16/07/2010, 16h38
  2. Réponses: 3
    Dernier message: 11/08/2008, 15h56
  3. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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