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

Discussion :

tableaux de QString

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut tableaux de QString
    Bonjours !

    Voici une description du problème que je rencontre, dans mon apprentissage long et délicat de Qt :

    j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private :
    QString *tableau = NULL;
    dans mon fichier .h de ma classe.
    j'ai modifié ce tableau dans un slot, en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tableau = new QString[nombre];
    (nombre a auparavant été définis dans le même slots)

    Ensuite je rempli mon tableau, et tout va très bien.

    Sauf que, lorsque je fait, dans un autre slot, une fois le tableau rempli (c'est obligatoire, car le second ne peut pas être appelé tant que le premier ne l'a pas été (le bouton est désactivé)) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QString chaine;
    chaine = "un mot "+ tableau[0]
    le compilateur m'insulte et me dit :
    invalids operands of types 'const char[8]' and 'QString*' to binary 'operator+'

    Pourtant, selon ce que je pensait savoir des tableaux, une "case" de mon tableau doit contenir un objet en tout point semblable à une QString ...
    Et donc que je suis censé pouvoir l'ajouter à une autre chaine, l'afficher, ...

    Mais le pire, c'est que je peux l'afficher, mais uniquement dans mon slot ou je l'ai rempli. Donc, dans le troisième slot, là ou le bug se trouve, il refuse d'afficher mon tableau[0] et me dit :
    no matching function for call 'QMessageBox::information(MainWindow* const, const char[8], QString*&)

    Donc il y a une grosse différence entre QString et une QString dans un tableau. La question est, pourquoi il l'affiche dans mon premier slot, et pas dans mon second ... car la ligne de code est la même, et le tableau a pas changé entre temps ...

    Voila où j'en suis dans ma réflexion. J'aurais aimer savoir qu'est-ce qui se passe, pourquoi, et comment faire pour résoudre ce problème.

    Merci d'avance ^^

  2. #2
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    Et si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QString chaine;
    chaine = QString("un mot ").append(tableau[0]);
    Car là tu essaye d'ajouter un char* "un mot " avec une QString via l'operateur operator+ et une telle fonction n'existe pas. Tout simplement.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    Et bien il ne me dit plus rien ...
    Mais pourquoi ne veut-il pas l'afficher seule ?
    En faite, je ne comprend pas qu'est-ce qui se trouve dans mon tableau ?
    Est-ce que c'est une QString, un pointeur, autre chose ?
    Parce que après, l'idée, c'est de comparer mon tableau avec une autre QString ... Mais je vois pas pourquoi est-ce que je ne peux pas l'afficher de partout avec le même code ...

    En gros, qu'est-ce qui change entre mes slots (pour l'affichage d'un coté, et pas de l'autre), et surtout, qu'elle est la différence entre une case d'un tableau de QString et une QString "classique" ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    Et ma comparaison ne fonctionne pas ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    QString chaine;
    chaine = "mot";
    tableau[0]="mot";
    QMessageBox::information(this, "dialogue", "affichage");
    if (tableau[0] == chaine)
    {
        QMessageBox::information(this, "correcte", "le tet est positif");
    }
    Windows affiche la première, et une fois que j'ai appuyé sur ok, il me met :
    truc.exe a cessé de fonctionner.
    Un problème a fait que le programme a cessé de fonctionner correctement. Windows va fermer ce programme et vous indiquer si une solution est possible.

    Donc je pense que le test ne fonctionne pas ...
    Comment peut-on corriger ce problème ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    J'ai aussi tenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QString chaine;
    chaine = tableau[0];
    Mais là, il me dit :

    invalid conversion from 'QString*' to 'char'
    initializing argument 1 of 'QString& QString::operator=(char)'

    Ce que je ne comprend pas, c'est que dans ce cas là, il ne gère que des QString ... Donc pourquoi est-ce qu'il vient me parler de char ??

  6. #6
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    Citation Envoyé par --Kaim-- Voir le message
    Et bien il ne me dit plus rien ...
    Mais pourquoi ne veut-il pas l'afficher seule ?
    En faite, je ne comprend pas qu'est-ce qui se trouve dans mon tableau ?
    Est-ce que c'est une QString, un pointeur, autre chose ?
    Parce que après, l'idée, c'est de comparer mon tableau avec une autre QString ... Mais je vois pas pourquoi est-ce que je ne peux pas l'afficher de partout avec le même code ...
    Tu dois avoir un autre problème indépendant de l'affichage. Car aucune raison que tu ne puisses pas l'afficher partout.

    Citation Envoyé par --Kaim-- Voir le message
    En gros, qu'est-ce qui change entre mes slots (pour l'affichage d'un coté, et pas de l'autre), et surtout, qu'elle est la différence entre une case d'un tableau de QString et une QString "classique" ?
    Il n'y en a pas à priori.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    Le problème d'affichage peut-il venir d'une mauvaise définition de mon tableau ?

    J'ai définit QString *tableau dans mon header, mais je n'ai créé véritablement le tableau que dans une fonction. Est-ce que mon tableau ne serait alors valable que dans cette fonction, comme toutes les variables locales ?

    Parce que je pensais que toutes les variables définies dans le constructeur et/ou dans le header étaient valables dans toute la classe. Du moins, c'est ce que j'ai cru remarquer.

  8. #8
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    Citation Envoyé par --Kaim-- Voir le message
    Le problème d'affichage peut-il venir d'une mauvaise définition de mon tableau ?

    J'ai définit QString *tableau dans mon header, mais je n'ai créé véritablement le tableau que dans une fonction. Est-ce que mon tableau ne serait alors valable que dans cette fonction, comme toutes les variables locales ?

    Parce que je pensais que toutes les variables définies dans le constructeur et/ou dans le header étaient valables dans toute la classe. Du moins, c'est ce que j'ai cru remarquer.
    Pourquoi tu n'utilises pas une QList<QString> qui est beaucoup plus simple à utiliser ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    Ok, je vais me renseigner sur cette QList<QString>...
    Merci du coup de main !

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    ÇA MARCHE !!!
    Tout fonctionne, c'est tout bon !

    Et devinez quoi ? Il y a un nouveau problème !
    Il me met :

    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    Ça, c'est quand par miracle j'arrive au moment où il ferme mon fichier, et se remet à zéro. Mais pourtant, je fais rien de spécial. Des idées ?

    C'est marrant, j'ai l'impression d'avoir une période de fonctionnement entre deux périodes de plantage... C'est peut-être pas qu'une impression.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    Oups !

    J'ai demandé de l'aide un peu vite ^^ Je cherchais la case 3 d'une QList de 3 éléments ^^
    Erreur classique...

    Voila, je pense que tout marche ! Merci de votre aide !!

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par johnlamericain Voir le message
    Pourquoi tu n'utilises pas une QList<QString> qui est beaucoup plus simple à utiliser ?
    faut mieux QStringList
    http://qt.developpez.com/doc/latest/qstringlist.html

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par yan Voir le message
    Salut,
    Un QVector<QString> n'aurait-il pas moins de overhead et ne sera-t-il pas plus efficace pour un accès aléatoire (avec []) ?

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Un QVector<QString> n'aurait-il pas moins de overhead et ne sera-t-il pas plus efficace pour un accès aléatoire (avec []) ?
    non car QList n'est pas une list
    et est justement optimisé en fonction de la taille de la classe.
    http://qt.developpez.com/doc/latest/qlist/#details
    Internally, QList<T> is represented as an array of pointers to items of type T. If T is itself a pointer type or a basic type that is no larger than a pointer, or if T is one of Qt's shared classes, then QList<T> stores the items directly in the pointer array. For lists under a thousand items, this array representation allows for very fast insertions in the middle, and it allows index-based access. Furthermore, operations like prepend() and append() are very fast, because QList preallocates memory at both ends of its internal array. (See Algorithmic Complexity for details.) Note, however, that for unshared list items that are larger than a pointer, each append or insert of a new item requires allocating the new item on the heap, and this per item allocation might make QVector a better choice in cases that do lots of appending or inserting, since QVector allocates memory for its items in a single heap allocation.

  15. #15
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Et QString c'est plus petit qu'un pointeur pour bénéficier des optimisations ?

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Et QString c'est plus petit qu'un pointeur pour bénéficier des optimisations ?
    non, c'est une des Qt's shared classes
    http://qt.developpez.com/doc/latest/...licitly-shared

    Qt implémente sur une majorité de ses classes le COW.

    En gros QVector == std::vector et la mémoire est contigüe.
    QList est un vecteur un peu plus intelligent et va adapter sa gestion mémoire en fonction du type. Par défaut, QList est plus adapté. Mais après ça dépend du besoin.

    QStringList est encore plus spécialisé pour gérer une collection de QString.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/08/2003, 18h04
  2. free sur des tableaux "a moitié dynamiques"
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 31/07/2003, 15h30
  3. [langage] erreurs utilisation tableaux 2 dimensions
    Par drosof dans le forum Langage
    Réponses: 11
    Dernier message: 01/07/2003, 11h44
  4. Réponses: 6
    Dernier message: 04/04/2003, 15h28
  5. Les tableaux en PL/SQL
    Par GRUMLY dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/08/2002, 18h10

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