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 :

Utilisation de QList ou de QVector pour un Sudoku ?

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut Utilisation de QList ou de QVector pour un Sudoku ?
    bonjour,

    ceci marche :
    fenetre.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     private:
        QList<Grille*> m_grille[3][3];
    puis:
    fenetre.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (int j=0;j<3;j++)
      m_grille[i][j] << new Grille((j*3+i),this);
    mais j'aimerais passer tout ça en QVector.

    ceci marche aussi:
    fenetre.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QVector<Grille*> m_grille[3][3];
    mais ça ne me parait pas correct

  2. #2
    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
    Salut.
    Tu cherche à faire quoi????

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut
    je cherche à faire un sudoku ^^
    donc j'ai une classe sudocase qui hérite de QPushButton.
    une classe grille qui contient 9 sudocases (m_sudocase[9])
    et un tableau de 3X3 grilles. (QVector)
    j'arrive à afficher les cases mais je n'arrive pas à accéder aux attributs de ces cases.

    voici les codes :
    [HIDE]
    fenetre.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
     
    class MaFenetre : public QWidget
    {
        //Q_OBJECT
     
        public:
        MaFenetre();
        ~MaFenetre();
     
     
        private:
        vector< vector< Grille > > m_grille;  //ligne modifiée
     
    };
    fenetre.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    MaFenetre::MaFenetre() : QWidget()
    {
        setFixedSize(TAILLE_X_FENETRE, TAILLE_Y_FENETRE);
        setStyleSheet("background-color: rgb(100,100,100)");
        m_grille.resize(3,vector<Grille>(3)); //ligne ajoutée
         for (int i=0;i<3;i++)
          for (int j=0;j<3;j++)
            m_grille[i][j] = Grille((j*3+i),this); //suppression du new.
    }
    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
     
    class Grille
    {
        public:
        Grille(){};
        Grille(int , QWidget*);
        ~Grille(){};
     
     
        private:
        SudoCase* m_sudocase[9];
     
    };
    grille.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Grille::Grille(int num,QWidget *qw)
    {
       for (int i=0;i<9;i++)
         m_sudocase[i] = new SudoCase(i,num,qw);
     
    }
    sudocase.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
     
    class SudoCase :  QPushButton
    {
        Q_OBJECT
     
        public:
        SudoCase();
     
        SudoCase(int,int,QWidget*);
        ~SudoCase(){};
     
        private:
        void calculPosition(int,int,int*,int*);
        int m_numero;
        int m_grille;
    };
     
    #endif
    sudocase.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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    void SudoCase::calculPosition(int num_case,int num_grille,int *posx, int *posy)
    {
     int basex,basey;
     if (num_grille==0) {basex=5;basey=5;}
     if (num_grille==1) {basex=175; basey=5;}
     if (num_grille==2) {basex=345; basey=5;}
     
     if (num_grille==3) {basex=5;basey=175;}
     if (num_grille==4) {basex=175; basey=175;}
     if (num_grille==5) {basex=345; basey=175;}
     
     if (num_grille==6) {basex=5;basey=345;}
     if (num_grille==7) {basex=175; basey=345;}
     if (num_grille==8) {basex=345; basey=345;}
     
     if (num_case==0) {*posx=basex; *posy=basey;}
     if (num_case==1 || num_case == 2) {*posx=55*num_case+basex; *posy=basey;}
     if (num_case==3) {*posx=basex; *posy = 55+basey;}
     if (num_case==4 || num_case == 5) {*posx=55*(num_case%3)+basex; *posy=55+basey;}
     if (num_case==6) {*posx=basex; *posy = 110+basey;}
     if (num_case==7 || num_case == 8) {*posx=55*(num_case%3)+basex; *posy=110+basey;}
    }
     
    SudoCase::SudoCase() : QPushButton(""), m_numero(0),m_grille(0)
    {
      setStyleSheet("background-color: rgb(255,255,255)");
      setFont(QFont("Comic Sans MS", 20));
      setCursor(Qt::PointingHandCursor);
    }
     
    SudoCase::SudoCase(int i,int num,QWidget *Qw) : QPushButton(QString::number(i+1),Qw), m_numero(i),m_grille(num)
    {
     int posx,posy;
     setStyleSheet("background-color: rgb(255,255,255)");
     setFont(QFont("Comic Sans MS", 20));
     setCursor(Qt::PointingHandCursor);
     calculPosition(i,num,&posx,&posy);
     
     setGeometry(posx,posy , TAILLE_BOUTON, TAILLE_BOUTON);
    }
    [/HIDE] <-- dommage que ça ne marche pas

  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
    Bonjour mrdus

    Je ne comprend pas très bien ton problème. Par contre, je ne suis pas sur que vous réalisez ce que vous manipulez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QList<Grille*> m_grille[3][3];
    n'est pas une QList de 3x3 mais un tableau de 3x3 de QList<> donc 9 QList différentes (chacune étant remplie à priori avec 1 seul élément Grille).

    Ce que vous voulez faire est simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Grille m_grillle[3][3];
    Pour accéder aux fonctions membres, il suffit ainsi d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SudoCase& ma_sudo_case = m_grille[i][j].m_sudocase[k];

    Autres remarques générales :
    - pourquoi utiliser deux séries de tableaux imbriqués (un de 3x3 et un autre de 9... pourquoi pas un second tableau de 3x3 au fait ?). Il serait préférable d'utiliser un tableau de 9x9 (surtout si ensuite tu veux ajouter une fonction qui teste la validité d'une ligne ou d'une colonne)

    - un tableau de type C n'est pas l'idéal (risque de fuite mémoire, en particulier si tu fais un delete m_grille; au lieu d'un d'un delete m_grille[]; Surtout que dans ton code, tu ne détruit même pas ton tableau = fuite mémoire).
    Il est plus sur d'utiliser un QVector de taille 9*9 et d'ajouter un opérateur de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SudoCase& Grill::operator() (const int x, const int y)
    {
        return m_grille[x+y*9];
    }
    - Utilise des références :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SudoCase::calculPosition(int num_case,int num_grille,int *posx, int *posy)
    - Pourquoi tu ne mets pas le nom des variables dans l'interface de tes classes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Grille(int , QWidget*);
    SudoCase(int,int,QWidget*);
    void calculPosition(int,int,int*,int*);

    En espérant avoir pu t'aider un peu. N'hésite pas à poster du code quand tu auras corrigé.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Bonjour mrdus

    Je ne comprend pas très bien ton problème.
    ho que si
    c'était justement le but de ma question.

    je me rendais compte que quelque chose n'allait pas (apres avoir lu pas mal de forums) et j'avais changé mon Grille m_grille[3][3] pour ce QList.

    c'est mon premier programme Qt , il me sert de TP.
    j'essaie...j'aimerais le faire le plus, heu, modifiable possible, afin de pouvoir changer certaines choses au fur et à mesure de mon apprentissage.

    j'avais imaginé la fenêtre comme représentant la grille du sudoku, le papier.
    puis découper cela en 9 petites grilles de 9 cases (donc comme un sudoku).
    au début je voulais même créer des objets ligne et colonnes qui contiendrait des pointeurs vers les cases qu'elles sont censées contenir (mais bon...j'ai déjà du mal avec mes 3x3 grilles de 9 cases )

    Quand j'accede à la grille 5, je sais quelles sont ses 9 cases.
    si je prend par exemple la case 2 de la grille 5 : hé bien je vais devoir faire tout un tas de calculs tout bête et sans interêt pour retrouver quelles cases lui sont voisines dans la ligne et la colonne correspondante.
    mais tant pis, il faut déjà que je comprenne comment ça marche.
    bref...

    je vais d'abord m'atteler à ce que tu viens de me dire
    un grand merci pour ton aide !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut
    bon j'ai modifié mon code afin d'avoir un tableau 2D de 3 vecteurs de 3 grilles.
    (cf fenetre.h et fenetre.cpp)
    ça fonctionne on dirait.
    seulement j'ai voulu changer ne serait-ce que le texte d'une case et je me heurte à des problèmes, parce que tu as raison : c'est n'imp cette histoire de grilles contenant des cases.
    donc je voudrais que chaque case de mon tableau de Qvector contienne directement un tableau de 9 SudoCases. je vire l'objet Grille(ainsi que les fichiers .h et .cpp correspondants), complètement inutile.
    seulement je capte pas comment faire

    à bien y regarder c'est peut etre un qvector de qvector de qvector...
    Qvector3D pourrait-il servir ?
    Images attachées Images attachées  

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut
    alors voici la solution que l'on m'a proposée et qui semble fonctionner :

    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
    #include <QVector>
     
    #define DIM1 10
    #define DIM2 20
     
    int main()
    {
        QVector<QVector<QVector< int > > > m_grille;
        m_grille.resize(DIM1);
        for(size_t i = 0; i < DIM1; ++i)
        {
            m_grille.at(i).resize(DIM2);
            for(size_t j = 0; j < DIM1; ++j)
            {
                m_grille.at(i).at(j).resize(9);
            }
        }
     
     
        size_t i,j,k;
        /* ... */
         m_grille.at(i).at(j).at(k); // avec i < DIM1, j < DIM2 et k < 9
     
        return 0;
    }
    Citation Envoyé par mrdus
    le code renvoie les erreurs suivantes :
    ligne 12 :
    error: passing 'const QVector<QVector<int> >' as 'this' argument of 'void QVector<T>::resize(int) [with T = QVector<int>]' discards qualifiers|

    ligne 15 :
    error: passing 'const QVector<int>' as 'this' argument of 'void QVector<T>::resize(int) [with T = int]' discards qualifiers|
    Ah oui, dans ce cas il faut utiliser l'opérateur [] qui a nécessairement une surcharge non-const.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/05/2009, 18h35
  2. Utiliser le recordset d'un état pour du publipostage
    Par Alexandre Sahli dans le forum Access
    Réponses: 2
    Dernier message: 06/10/2006, 23h03
  3. utiliser des morceaux d'une image pour faire des boutons
    Par Battosaiii dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 14/12/2005, 00h05
  4. [CKEditor] Qui utilise FCKeditor sur son site php pour config ?!
    Par guy2004 dans le forum Bibliothèques & Frameworks
    Réponses: 62
    Dernier message: 26/10/2005, 18h24
  5. utiliser le quickreport et le sql pour interroger une table
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 7
    Dernier message: 28/07/2005, 08h46

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