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 :

Problème avec QVector

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut Problème avec QVector
    Bonjour,

    Je cherche à faire un Sudoku et j'ai un problème pour changer les valeurs de mes QVector.
    J'ai une QList de QVector pour représenter les lignes, les valeurs sont initialisées à -1 au départ. J'essaye ensuite de faire des insertions dans ma grille en modifiant les valeurs.

    Voici mon Grille.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
    24
    25
    26
    27
    28
    29
    30
    31
    #ifndef GRILLE_H_
    #define GRILLE_H_
    #include <QString>
    #include <QMatrix>
    #include <QVector>
    #include <QList>
     
     
    class Grille
    {
        private:
                //La taille de la grille.
                int taille_;
                //La matrice représentant le grille.
                QList<QVector<int> > matrice_;
                Grille();
     
        public:
                virtual ~Grille();
                static Grille* chargerGrille(QString path);
                void setTaille(int taille);
                int getTaille();
                QList<QVector<int> > getMatrice();
                bool controleLigne(int index, int valeur);
                bool controleColonne(int index, int valeur);
                bool controleCarre(int ligne, int col, int valeur);
                QList<int> getPossibilite(int ligne, int col);
                void inserer(int ligne, int col, const int &valeur);
    };
     
    #endif /* GRILLE_H_ */
    et voici ma fonction inserer :

    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
    24
    /**
      Insérer une valeur dans la grille
      */
    void Grille::inserer(int ligne, int col, const int &valeur)
    {
        this->matrice_[ligne][col] = valeur;
     
        qDebug("-------------------------------");
        for(int i = 0; i < matrice_.size(); i++)
        {
            QVector<int> ligne = matrice_.value(i);
            QVectorIterator<int> it(ligne);
            int col = 0;
            QString l;
            while(it.hasNext())
            {
                int val = it.next();
                l.append(QString::number(val)+" ");
                col++;
            }
            qDebug(l.toAscii());
        }
        qDebug("-------------------------------");
    }

    Et voilà ce que me donne la console. J'insère un 3 dans la deuxième ligne, l'affichage prend en compte le changement. Mais lors d'une autre insertion, le 3 disparaît. Pourtant il me semble bien modifier le bon QVector.

    -------------------------------
    -1 -1 6 7 -1 -1 -1 -1 3
    5 [3] -1 -1 4 -1 -1 -1 -1
    1 2 -1 -1 -1 -1 7 -1 6
    -1 1 -1 -1 -1 -1 5 6 -1
    4 -1 2 -1 5 1 -1 8 -1
    -1 5 7 -1 -1 -1 2 -1 -1
    -1 -1 -1 3 9 6 -1 -1 5
    7 -1 -1 -1 -1 -1 -1 -1 -1
    -1 -1 -1 2 -1 -1 -1 4 1
    -------------------------------
    -------------------------------
    1 -1 6 7 -1 -1 -1 -1 3
    5 [-1]! -1 -1 4 -1 -1 -1 -1
    1 2 -1 -1 -1 -1 7 -1 6
    -1 1 -1 -1 -1 -1 5 6 -1
    4 -1 2 -1 5 1 -1 8 -1
    -1 5 7 -1 -1 -1 2 -1 -1
    -1 -1 -1 3 9 6 -1 -1 5
    7 -1 -1 -1 -1 -1 -1 -1 -1
    -1 -1 -1 2 -1 -1 -1 4 1
    -------------------------------

    merci d'avance.

  2. #2
    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
    Bonsoir Guillaume63

    Plusieurs remarques :

    1. un conteneur de conteneur (QList de QVector), c'est très moche !
    Fais un recherche dans le forum C++ pour les tableaux 2D, le sujet est régulièrement abordé

    2. A la ligne 11 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QVector<int> ligne = matrice_.value(i);
    tu ne récupères par une ligne de ton tableau, tu copies cette ligne. Donc après modification, quand tu quittes la fonction, tu effaces la copie et l'original n'est pas modifié.

    soit tu modifies ton design (meilleure solution)

    soit tu utilises une référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QVector<int>& ligne = matrice_[i];
    3. idem pour ta fonction getMatrice qui fait une copie


    Bon courage

  3. #3
    Membre averti
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut
    Merci pour ces précisions, je développe plus en java habituellement et c'est vrai que ces passages par références ne sont pas totalement clair pour moi.

  4. #4
    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
    je développe plus en java habituellement
    Oui j'ai vu QVectorIterator est une classe pour avoir une API proche du java. En général, on préfère les itérateur STL-like, quand on vient du C++, on est plus habitué à cette approche (et honnêtement, tu es la première personne que je vois utiliser QVectorIterator)

    ces passages par références
    Ce n'est pas non plus ce qu'il y a de mieux.
    Le mieux est d'avoir un conteneur 2D et d'accéder directement aux éléments avec leurs positions.

    Comme je suppose que tu as suivi mon conseil et que tu as fait des recherches sur le forum C++ sur le conteneur 2D, tu as du voir que le mieux est d'utiliser un conteneur 1D et d'ajouter une fonction pour y accéder en 2D ?


    Allez, je suis d'humeur gentille ce matin : le mieux est de faire une classe de ce type (en plus, un soduku, c'est facile, les dimensions sont fixes) :

    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
    class SodukuGrille 
    {
    public:
       // on construit le tableau avec 81 valeurs
       SodukuGrille() : m_values(81) {}
     
       // on modifie une valeur
       void setValue(int value, int x, int y) { m_values[index(x,y)] = value; }
     
       // on récupère une valeur
       int getValue(int x, int y) { return m_values[index(x,y)] }
     
    private:
       // tu peux utiliser ici n'importe quel conteneur qui possède l'opérateur []
       QVector<int> m_values; 
     
       // calcul de l'index dans le vecteur correspondant aux coordonnées (x, y)
       int index(int x, int y) { return (x + y * 9); } 
    };
    Petites remarques :
    - les index vont de 0 à 8 (en C++, les index commencent à 0)
    - c'est une classe minimaliste, qui ne fait pas de test sur les valeurs de x et y. Faire fonctionnera. Il faut peut être ajouter les tests

    Tout simplement.

    Bon courage

  5. #5
    Membre averti
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut
    Bonsoir,

    J'ai fais un tableau en 2D comme tu me l'avais indiqué mais c'est vrai que le tableau de 81 cases peut être intéressant.

    Petite question concernant mon tableau en 2D :

    Je l'initialise comme ça (ça m'a l'air correct en voyant le debug)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            //Initialisation du tableau dynamique.
            g->matrice_ = new int*[taille];
     
            for(int i = 0 ; i < taille ; i++)
            {
                g->matrice_[i] = new int[taille];
            }
    Ensuite je rentre mes valeurs provenant d'un fichier comportant la grille.

    Cependant j'ai un dernier problème, concernant mon getMatrice(), la methode qui retourne ma matrice.

    Voila ma déclaration dans le .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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #ifndef GRILLE_H_
    #define GRILLE_H_
    #include <QString>
    #include <QMatrix>
    #include <QVector>
    #include <QList>
     
     
    class Grille
    {
        private:
                //La taille de la grille.
                int taille_;
                //La matrice représentant le grille.
                //QList<QVector<int> > matrice_;
                int **matrice_;
                Grille();
     
        public:
                virtual ~Grille();
                static Grille* chargerGrille(QString path);
                void setTaille(int taille);
                int getTaille();
                //QList<QVector<int> >& getMatrice();
                int**& getMatrice();
                bool controleLigne(int index, int valeur);
                bool controleColonne(int index, int valeur);
                //bool controleCarre(int ligne, int col, int valeur);
                QList<int> getPossibilite(int ligne, int col);
                void inserer(int ligne, int col, const int &valeur);
    };
     
    #endif /* GRILLE_H_ */
    et l'implementation de ma méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int**& Grille::getMatrice()
    {
        return matrice_;
    }
    Je ne pense pas que ma fonction retourne ma matrice comme je le souhaite car lorsque je l'appel dans ma vue le debug me donne -1 pour la valeur de ma matrice.

    Pense tu que je devrais plutôt faire une méthode que renvoie un int en passant le ligne et le colonne de la matrice?
    Je ne sais pas trop quelle approche adopter.

    merci

  6. #6
    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


    Je te déconseille d'utiliser un conteneur de conteneur et du coup tu passes de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QList<QVector<int> > matrice_;
    à un tableau dynamique...
    Tu as une raison particulière de te compliquer la vie inutilement ?

    Donc, un conseil : vire tes new et tes pointeurs !

    Un rappel : règle de base : pas de pointeur sauf si nécessaire

    Au pire, tu utilises un tableau statique :
    à la place de QVector mais c'est tout

    Pense tu que je devrais plutôt faire une méthode que renvoie un int en passant le ligne et le colonne de la matrice?
    Si tu as regardé le code que je propose, oui c'est ce que je te conseille

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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