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 :

Tableau Dynamique procédure de copie


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut Tableau Dynamique procédure de copie
    Bonjour à tous ,

    J'ai crée une classe Personne avec ses caractéristiques que je dois mettre en File sans pour autant utiliser la classe Vector ou toute classe héritée ni même Queue .

    La seule solution ( à mon niveau ) est de créer un tableau dynamique. J'ai lu dans la FAQ du forum:
    Pour agrandir une zone (généralement un tableau) allouée via l'opérateur new il faudra faire la manipulation à la main :
    - Allouer un nouvel espace mémoire de la taille souhaitée
    - Y copier son contenu
    - Libérer l'ancien espace mémoire
    J'ai donc fait une nouvelle classe File dans laquelle j'ai un attribut de la forme :

    Personne *Tab;

    Rien ne me parait compliqué jusqu'au moment d'ajouter une personne dans la file c'est assez affreux, j'en arrive même à faire "bipper" mon pc lors de certaines éxécution du code source.

    Je me pose des questions :
    Comment bien utiliser le constructeur par copie? ( je n'ai pas de problème pour le créer, c'est plutot pour m'en servir)
    va-t-il toujours en paire avec operator= ?

    si vous avez quelques exemples je suis preneur.

  2. #2
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Bonjour.

    Tu arrive à faire biper le pc O_o... je me demande bien comment tu fais...

    enfin bon, de manière générale, on peut créer une classe liste comme suit:
    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
    class ListePersonne 
    {
       Personne* Tab;
       size_t Taille;
    public:
       ListePersonne():Taille(0){}
       void Ajouter(const Personne & P){
          if (Taille!=0)
          {
              //On recopie l'adresse de Tab.
              Personne* provTab=Tab;
              //On crée un nouveau Tab de taille Taille+1
              Tab=new Tab[++Taille];
              //On recopie l'ancien tableau dans le nouveau
              for(size_t i=0;i<Taille-1;++i)
                 Tab[i]=provTab[i];
              //et on supprime l'ancien !
              delete [] provTab;
           }
           else
              Tab=new Tab[++Taille];
           Tab[Taille-1]=P;
        }
       ~ListePersonne()//destructeur, il faut désallouer Tab
       {
           if (Taille!=0)
              delete [] Tab;
       }
    };
    voilà, tu a les fonctions sensibles. essaye de les comprendre et crée le reste.


    Bonne chance

  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, et bienvenue sur le forum.

    Pourrais tu expliquer à quelle restriction tu es confronté qui t'empêcherait de recourir aux collections standard du C++ ou à celle de boost

    En effet, l'idéal reste toujours de manipuler les collections d'objets propres au C++ tant que faire se peut et de n'envisager de passer à un tableau "C style" que lorsque tu n'a vraiment pas le choix (lorsqu'il s'agit d'appeler une fonction écrite en C, par exemple)...

    Avec la classe vector, par exemple, il "suffit", pour obtenir un tableau C style, de récupérer l'adresse de l'élément se trouvant à l'index 0...

    La norme garanti en effet que les différents éléments d'un std::vector sont placés de manière contigüe en mémoire.

    Ainsi, avec une fonction "C" dont la signature serait proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void foo(Personne* tab, size_t size);
    tu peux parfaitement envisager de travailler sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector<Personne> vecteur;
    /* insertion / ajout des éléments dans le vecteur */
    foo(&vecteur[0],vecteur.size());
    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 averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut
    Merci pour ces deux réponses.

    Méphistopheles j'ai bien compris ta réponse je vais dès maintenant le mettre en pratique et d'ici ce soir je posterai pour d'éventuels nouveaux problèmes ou juste pour signaler que le sujet est résolu

    Je t'explique pour les restrictions koala01.
    Je suis étudiant, j'ai déjà fais en TP de C++ la version utilisant la classe vector c'est très facile à manipuler j'ai vraiment pas eu de difficulté.
    A la fin du cours l'enseignant nous a conseillé de refaire ce travail sans l'utiliser pour pratiquer pendant nos vacances et me voilà .

    Tu arrive à faire biper le pc O_o... je me demande bien comment tu fais...
    J'aurais aimé te montrer ce qui s'affichait en console mais je n'arrive pas à réécrire mon erreur. Quelque chose qui m'a surpris, c'est qu'a la fin d'un long discours incompréhensible ( pour moi ) dans la console, il y a eu plusieurs ligne vide suivi de 3 smileys, faudrait vraiment que je retrouve ça pour le poster^^.

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int x = 12;
     
     
    std::string myString;
     
    string += x;

    devrait reproduire ton jolie bug (bip + smyley). Par ailleurs je comprends pas trop cette approche (celle du prof) si tu réussis avec le vector alors tant mieux, pourquoi se mélanger les pinceaux avec ce genre de code C-like?

  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 Geo34 Voir le message
    <snip>
    Je suis étudiant, j'ai déjà fais en TP de C++ la version utilisant la classe vector c'est très facile à manipuler j'ai vraiment pas eu de difficulté.
    A la fin du cours l'enseignant nous a conseillé de refaire ce travail sans l'utiliser pour pratiquer pendant nos vacances et me voilà .
    Y a des coups de pied quelque part qui se perdent...

    Pas de ton coté, parce que tu ne fais que suivre les instructions du prof, mais du coté du prof, car c'est une très mauvaise idée que d'inciter les élèves à prendre des habitudes issues du C alors que le standard fournit tout ce qui permet de sécuriser son travail et de se faciliter la vie

    Si ton prof est ouvert à la discussion, tu peux lui dire de ma part qu'il mérite ce coup de pied
    J'aurais aimé te montrer ce qui s'affichait en console mais je n'arrive pas à réécrire mon erreur. Quelque chose qui m'a surpris, c'est qu'a la fin d'un long discours incompréhensible ( pour moi ) dans la console, il y a eu plusieurs ligne vide suivi de 3 smileys, faudrait vraiment que je retrouve ça pour le poster^^.
    Ca, c'est, typiquement, le signe que tu corromps la mémoire à un moment donné... ou que tu as un pointeur non initialisé quelque part...

    Au fait, le terme file représente une structure capable de représenter un système FIFO (First In, First Out), que l'on pourrait comparer à ce qui se passe dans les magasins lorsqu'il y a du monde aux caisses...

    Il n'y a, normalement, pas besoin de manipuler un pointeur de personne, mais il est intéressant de créer en réalité deux structures:
    • la première (nommons la "Element") qui représente un élément unique de la file, qui contient comme information la personne et... le moyen d'accéder à l'élément suivant
    • la deuxième (nommons la "File") qui représente... l'intégralité (tous les éléments) de la file

    Typiquement, cela prendrait une forme proche de
    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
    class Element
    {
        private:
            Personne pers;
            Element *suivant;
    };
    class File
    {
        private:
            /* le premier élément de la file */
            Element * premier;
            /* il est souvent intéressant de connaitre aussi le dernier élément  */
            Element *dernier;
            /* et la taille */
            size_t taille;
    }
    Il faut penser que:
    l'insertion d'un élément dans la file va occasionner des changements:
    • au niveau du pointeur "suivant" du dernier élément de la file
    • des changement au niveau de la taille de la file
    • peut etre (si c'est le premier élément que l'on ajoute) au niveau du premier élément de la file
    et que la suppression (du premier élément, car c'est normalement le seul que l'on puisse supprimer du fait que c'est un FIFO), va occasionner des changement fortement similaires
    [EDIT]En outre, le pointeur suivant doit être initialisé systématiquement à la seule adresse connue pour être invalide mais qui soit testable: NULL, modifié uniquement lorsqu'il y a lieu et la validité de l'adresse doit être systématiquement testée avant de tenter d'accéder à l'élément suivant
    [/EDIT]
    PS: le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(tab)
        delete [] tab;
    est tout à fait inutile...

    delete et delete[] sont prévus pour ne rien faire s'ils s'appliquent sur NULL, et cela ne garanti de toutes manières rien si, par malheur, tab n'est pas NULL mais est invalide
    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

  7. #7
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Y a des coups de pied quelque part qui se perdent...
    Pourquoi ?
    C'est très bien je trouve ce que fait le prof. Pendant le TP les élèves utilisent std::vector qui est clairement beaucoup plus efficace et plus sûr qu'une solution à la main, en revanche, pour les intéressés il conseille de refaire l'exercice sans std::vector pendant les vacances, histoire de mieux comprendre les entrailles de la bête (ce qui peut servir, parfois)

    Geo34, si tu comprends l'anglais je te conseille le livre Accelerated C++. Il y a justement un long chapitre assez génial qui reconstruit std::vector de A à Z de manière extrêmement pédagogique et qui m'avait vraiment ouvert les yeux à l'époque. Grâce à Accelerated C++, Geo34, toi aussi tu seras capable de lire les header de la STL directement sans sombrer dans la folie. (c'est même presque clair !)

  8. #8
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par koala01 Voir le message
    PS: le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(tab)
        delete [] tab;
    est tout à fait inutile...

    delete et delete[] sont prévus pour ne rien faire s'ils s'appliquent sur NULL, et cela ne garanti de toutes manières rien si, par malheur, tab n'est pas NULL mais est invalide
    Heu... ou est-ce que tu vois ça ? personellement, je fait un test sur la taille du tableau et non sur tab, justement pour éviter le problème lié au pointeur invalide... qui il me semble n'est lui pas garanti par la norme...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/08/2008, 14h09
  2. Réponses: 4
    Dernier message: 01/01/2007, 10h26
  3. Copie de tableau dynamique Tridimensionel
    Par Zenol dans le forum C++
    Réponses: 23
    Dernier message: 19/12/2005, 16h00
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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