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

 C++ Discussion :

Classe tableau à 2D


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut Classe tableau à 2D
    Bonjour,
    je dois créer une classe Tableau représentant un tableau à deux dimensions en C++ (mode console).

    J'ai su le créer de la façon suivante:
    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 Tableau
    {
            int * t;
            unsigned nbR, nbC ;
     
        public:
            Tableau(){
            nbC=5;
            nbR=3;
            t = new int [nbC*nbR] ;
            }
            ......
    }
    Mais je dois le créer en tant que "VRAI" tableau à 2d. C-à-d:
    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 Tableau
    {
            int * t; ---> comment faire? une double indirection?
            unsigned nbR, nbC ;
     
        public:
            Tableau(){
            nbC=5;
            nbR=3;
            t = new int [nbC][nbR] ;
            }
            ......
    }
    Ce code est-il correcte? Et comment dois je déclarer mon attribut "t"?
    Est ce que : int ** t est correcte?

    Merci d'avance et bonne soirée!

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 13
    Par défaut
    Pour encoder une matrice, le plus simple est d'utiliser un vecteur de dimension largeur*hauteur, et tu récupères l'élément x,y à l'indice x*largeur+y de ton vecteur. A toi alors de faire des fonction d'interface getValue et setValue pour gérer ça de façon plus transparente.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Le plus robuste à faire, c'est bien comme tu l'as fait au début, à savoir de créer un vecteur de [ligne * colonnes] éléments.

    Si, vraiment, tu a besoin des deux dimensions (parce que la matrice n'est pas complète, par exemple) et que tu veux définir dynamiquement le nombre de lignes et de colonnes, il faut envisager de passer par... un pointeur de pointeur.

    La première indirection sera alors utilisée pour demander l'allocation d'un vecteur de ... pointeurs sur les éléments (lignes) et la seconde pour représenter un vecteur d'éléments (les colonnes de chaque lignes).

    Remarque qu'il est difficile d'assurer l'exception safty dans ce cas car *idéalement* toute fonction ne devrait pas faire plus d'une allocation dynamique/ libération de la mémoire pour l'assurer.

    Mais le constructeur de ta classe pourrait ressembler à
    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
    Tab2D::Tab2D(int line, int row):line(line),row(row),tab(NULL)
    {
        try
        {
            tab = new type*[line];
            /* indispensable pour assurer l'exception safety */
            for(int i=0;i<line;++i)
                tab = NULL;
            for(int i=0;i<line;++i)
                tab[i] = new type[row];
        }
        catch(std::exception& e)
        {
            /* si l'allocation du pointeur de pointeur a réussi, il faut
             * libérer la mémoire allouée aux tableaux avant que
             * l'exception ne soit lancée
             */
            if(tab!=NULL)
            {
                for(int i=0;i<line;++i)
                    delete[] tab[i];
            }
            delete[] tab;
            tab=NULL;
            /* sans oublier de relancer l'exception */
            throw e;
        }
    }
    Ce code n'est qu'une des solutions envisageables et se base sur le fait que l'invocation de delete sur une adresse valant NULL est assurée ne rien faire

    Ceci dit, cette solution est - de loin - la plus mauvaise des bonnes idées, car, l'idéal reste quand même d'utiliser la classe vector, fournie par le standard dans l'espace de noms stdpar inclusion du fichier d'en-tête <vector> voir l'une des classes proposée par boost
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    Bonjour,
    je ne peux pas utiliser de vector.... Je suis obligé d'utiliser les pointeurs! Dans ce cas, je dois utiliser ton exemple?

    Autre question, dans les attributs le tableau sera bien déclaré comme suit?
    ??

    Etant débutant, je suis obligé de traiter l'exception?

    Merci d'avance.

  5. #5
    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 alex2746 Voir le message
    Bonjour,
    je ne peux pas utiliser de vector.... Je suis obligé d'utiliser les pointeurs! Dans ce cas, je dois utiliser ton exemple?
    Si cela répond à ton besoin, alors profites-en !
    Citation Envoyé par alex2746 Voir le message
    Autre question, dans les attributs le tableau sera bien déclaré comme suit?
    ??
    Une bonne réponse à une question est souvent une question : A ton avis, au vue du code, que doit représenter t? Un entier, un tableau d'entier? Un tableau de tableau d'entier?

    Citation Envoyé par alex2746 Voir le message
    Etant débutant, je suis obligé de traiter l'exception?
    Le traitement d'une exception n'est pas lié à un niveau débutant ou expert. Le traitement des exceptions est ce qui te permet de gérer les erreurs qui peuvent survenir dans ton programme. Donc, la réponse est: si tu veux augmenter la fiabilité de ton code et mettre en oeuvre les bonnes pratiques, apprend à utiliser les exceptions. Tu trouveras des entrées dans les cours (par exemple, ici) ou dans la FAQ. Dans le cadre d'un exercice, cela peut être l'occasion de commencer à se familiariser avec le concept.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par alex2746 Voir le message
    Bonjour,
    je ne peux pas utiliser de vector.... Je suis obligé d'utiliser les pointeurs! Dans ce cas, je dois utiliser ton exemple?
    oui, si tu veux réellement pouvoir utiliser les deux dimensions, et non travailler sous la forme d'un tableau n'en ayant qu'une comme précisé
    Autre question, dans les attributs le tableau sera bien déclaré comme suit?
    ??
    Tu sais comment représenter un pointeur, mais je t'ai parlé de... pointeur de pointeur... dés lors, à ton avis (aide toi de la réponse de 3DArchi )
    Etant débutant, je suis obligé de traiter l'exception?
    LA réponse de 3DArchi est juste, mais on pourrait rajouter quelque chose:

    Lorsque tu travailles avec new, tout comme lorsque tu travaille avec malloc en C, cela revient à dire au compilateur que
    je me charge moi même de gérer le moment où la mémoire allouée à une variable sera libérée
    Or, lorsqu'une exception est lancée dans le constructeur, l'objet qui contient la variable dont tu as décidé de gérer toi-même la mémoire n'est ... simplement pas créé.

    Si des instructions propres à la gestion dynamique de la mémoire a été effectué (le tab=new *int[x] ou l'un (ou plusieurs tab[i]=new int[y]), le fait de ne pas invoquer le delete[] sur tab ou sur les tab[i] correspondants provoquera une fuite mémoire (vu que tu te trouve dans la situation de devoir décider toi même de la libération de cette mémoire) parce que tu perd toute possibilité d'accéder à cette mémoire non libérée.

    Quelque part, l'excuse du "je suis débutant" permet de comprendre le fait que tu ne gère pas les exception et que tu ne travailles pas de manière "exception safe", mais, une fois que l'on a attiré ton attention sur ce point, si tu décide de ne pas les prendre en compte, il ne faudra pas t'étonner si tes applications restent bancales.

    Maintenant, que tu aie un peu de mal à les gérer correctement au début reste malgré tout compréhensible, mais ca ne veut pas dire qu'il ne faille pas les gérer
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. [PHP 5.3] Test sur Classe Tableau
    Par swampsnake dans le forum Langage
    Réponses: 4
    Dernier message: 31/08/2011, 14h23
  2. [Tableaux] Class tableau HTML
    Par LDDL dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 1
    Dernier message: 10/03/2010, 13h12
  3. Que pensez-vous de ma classe tableau ?
    Par deubelte dans le forum C++
    Réponses: 18
    Dernier message: 31/12/2009, 18h14
  4. Créer une classe tableau
    Par rouliane dans le forum C++
    Réponses: 36
    Dernier message: 29/01/2008, 23h48
  5. tabeau de classe = tableau de classe
    Par Bason_sensei dans le forum C++
    Réponses: 25
    Dernier message: 12/10/2005, 13h01

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