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 :

Tableau à deux dimensions de QLabel

  1. #1
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 336
    Par défaut Tableau à deux dimensions de QLabel
    Bonjours,

    Je souhaiterai créer une matrice de QLabel, seulement lors de la compilation Qt Creator me renvoi cette erreur :

    Cannot convert 'QLabel*** to QLabel**' in assignement
    dans mon fichier .h je declare comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     QLabel** case_plateau;
    et l'instanciation est réalisée dans le constructeur du .cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    this->case_plateau = new QLabel**[8];
        for(int i=0 ; i<8;i++)
        {
            this->case_plateau[i] = new QLabel*[8];
        }
     
        for(int i=0 ; i<8 ; i++)
        {
            for(int j=0 ; j<8 ; j++)
            {
                if(i%2==0)
                {
                    this->case_blanche = new CaseBlanche(i,j,"debug/blanc.jpg","blanc");
                    this->case_plateau[i][j] = new QLabel(this->case_blanche->getCase());
                }
                else
                {
                    this->case_noir = new CaseNoir(i,j,"debug/noir.jpg","noir");
                    this->case_plateau[i][j] = new QLabel(this->case_noir->getCase());
                }
            }
        }
    Pourtant il s agit bien de créer le nombre de "ligne" et ensuite dans une boucle simple le nombre de "colonne" tout en "enlevant un pointeur".

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    this->case_plateau = new QLabel**[8];
    Là t'essayes de mettre un QLabel*** dans ton QLabel**.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    this->case_plateau[i] = new QLabel*[8];
    Là t'essayes de mettre un QLabel** dans un QLabel*.

    Le compilateur dit tout en fait. Quand tu crées un tableau :
    tableau est de type int* et contient l'adresse du premier élément du tableau.

    Là ton case_plateau est un tableau de QLabel**, c'est donc bien un QLabel***. Tu as juste à enlever une * à ces deux lignes je crois

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour dharkan

    Un conseil très important : n'utilise pas de tableau dynamique et de pointeur !

    Fais une recherche sur ici ou sur forum C++, le problème des tableaux 2D a déjà été abordé plein de fois (il faudrait peut être que l'on ajoute une entrée dans la FAQ sur ce point)
    Regarde par exemple la classe DynamicArray2D de QExtend.

    De plus :
    - est inutile dans ton code
    - tu as de jolies fuites mémoire avec tes et (à priori, il faut voir le code de CaseNoir et CaseBlanche)

    Soit tu sais gérer la mémoire toi même et tu peux prendre le risque (souvent inutile) de travailler avec des tableaux dynamiques. Sois tu ne sais pas gérer la mémoire toi même (ou tu as envie de te compliquer la vie inutilement) et tu utilises ce que te propose le C++, la STL et Qt pour ne pas gérer la mémoire toi même (std::vector QVector, etc.)

  4. #4
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 336
    Par défaut
    voici le code de caseNoir :

    .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #ifndef CASENOIR_H
    #define CASENOIR_H
     
    #include "case.h"
    #include <QLabel>
    #include <QString>
    using std::string;
     
    class CaseNoir : public Case
    {
        private :
            QString couleurCase;
     
        public:
            CaseNoir(int,int,QString,QString);
            CaseNoir(const CaseNoir& );
     
            QLabel* getCase()const;
     
    };
     
    #endif // CASENOIR_H
    .cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #include "case.h"
    #include "casenoir.h"
     
    CaseNoir::CaseNoir(int px,int py,QString chemin,QString couleur):Case(px,py,chemin)
    {
        couleurCase = couleur;
    }
    CaseNoir::CaseNoir(const CaseNoir& cn):Case(cn)
    {
        couleurCase = cn.couleurCase;
    }
     
    QLabel* CaseNoir::getCase()const
    {
        return Case::getCase();
    }
    le code de caseBlanche étant le meme

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bon, ça confirme la fuite mémoire... et donne encore plus d'importance à mon conseil de ne pas utiliser de pointeurs !

  6. #6
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 336
    Par défaut
    salut gbdivers,

    pourrait-tu m expliquer ou me dire ou je peux trouver comment on peut voir s'il y a des fuites memoire ?

    Sinon je vais tenir de ton conseil sur les pointeurs

  7. #7
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 774
    Par défaut
    Citation Envoyé par dharkan Voir le message
    pourrait-tu m expliquer ou me dire ou je peux trouver comment on peut voir s'il y a des fuites memoire ?
    Valgrind ?

    Sinon, pointeur == fuite de mémoire. À chaque fois que tu as un pointeur, il faut que tu supprimes ce qu'il pointe quand tu n'en as plus besoin. Quand tu sors du scope, le pointeur est détruit mais pas ce qu'il pointe. Plus côté C++, un new ne va pas sans delete, à moins d'avoir des dérivés de QObject (gestion de la mémoire : dès qu'un parent est supprimé, ses enfants le sont aussi, pas besoin d'en tenir la liste quelque part, c'est fait automatiquement).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  8. #8
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 336
    Par défaut
    Merci de ta réponse,
    cependant je n'utilise pas de pointeur dans cette classe,
    seulement un pointeur qui est renvoyer dans les méthode getCase()
    et la dans la classe mère je delete le QLabel dans le destructeur.

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

Discussions similaires

  1. [Tableaux] tri de tableau deux dimensions
    Par oursquetaire dans le forum Langage
    Réponses: 8
    Dernier message: 27/12/2005, 14h27
  2. Affichage d'un tableau à deux dimensions.
    Par Allan dans le forum C
    Réponses: 3
    Dernier message: 11/12/2005, 18h29
  3. Réponses: 1
    Dernier message: 18/11/2005, 11h38
  4. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38
  5. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50

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