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 :

Allocation et réallocation dynamique de tableaux


Sujet :

C++

  1. #1
    Membre à l'essai

    Inscrit en
    Juillet 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 23
    Points : 23
    Points
    23
    Par défaut Allocation et réallocation dynamique de tableaux
    Bonjour à tous

    je débute en C++, j'ai un programme à faire ou je vais rechercher un nombre indéterminé de données depuis un fichier. Il faut donc que j'utilise l'allocation dynamique.
    Pour cela je crée un tableau d'objets dont je fixe la taille à 100 au départ, et si je n'ai pas assez de place, je double sa taille (je me sers d'un autre tableau tampon pour garder les données pendant que j'agrandis l'autre tableau).

    En fait je suis obligé de faire tous ça parceque je n'ai pas le droit d'utiliser la STL.

    Donc tout ça marche très bien, sauf que à la fin quand je quitte le programme je veux libérer les espaces alloués en faisant delete[], et c'est là que généralement le programme plante. je ne sais pas d'où ça vient, peut-être de l'allocation et réallocation des tableaux que je ne fais pas correctement?


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    // datastructure.cc
    // definition of the interface
     
    #include <cstdlib>
    #include <iostream>
    #include "datastructure2.hh"
     
    // the standard namespace for convenience
    using namespace std;
     
    // Constructor of the class
    Datastructure2::Datastructure2() : i(0)
    {
        taille_tableau=100;
        database=new Result[taille_tableau];
     
    }
     
    // destructor
    Datastructure2::~Datastructure2()
    {
        removeAll();
    }
     
     
     
    int Datastructure2::size()
    {
        return i;
    }
     
     
    // Add a new element
    bool Datastructure2::add(Result* new_r, int index)
    {
       //s'il n'y a plus assez de place dans le tableau, je double sa taille
        if(!(taille_tableau>i))
        {
     
            tampon = new Result[taille_tableau];
     
            for(int j=0;j<taille_tableau;j++)
            {
                tampon[j].name = database[j].name;
                tampon[j].totalresult = database[j].totalresult;
                tampon[j].results = database[j].results;
     
            }
     
            taille_tableau*=2;
     
            database=new Result[taille_tableau];
     
            for(int j=0;j<taille_tableau/2;j++)
            {
                database[j].name = tampon[j].name;
                database[j].totalresult = tampon[j].totalresult;
                database[j].results = tampon[j].results;
            }
        }
     
        if(i == (index-1))
        {
            database[i].name = new_r->name;
            database[i].totalresult = new_r->totalresult;
            database[i].results = new_r->results;
     
        }
        else
        {
            for(int z=i;z>index-1;z--)
            {
                database[z].name = database[z-1].name;
                database[z].totalresult = database[z-1].totalresult;
                database[z].results = database[z-1].results;
     
            }
            database[index-1].name = new_r->name;
            database[index-1].totalresult = new_r->totalresult;
            database[index-1].results = new_r->results;
        }
        i++;
     
        return true;
    }
     
    Result& Datastructure2::operator[]( int index )
    {
        return database[index-1];
    }
     
    // removes the element at the index
    void Datastructure2::remove( int index )
    {
        for(int z=index-1;z<i;z++)
        {
            database[z].name = database[z+1].name;
            database[z].totalresult = database[z+1].totalresult;
            database[z].results = database[z+1].results;
        }
     
        i--;
    }
     
    // deletes all elements from the data structure by using delete
    // cette fonction est appelée depuis le main quand le programme est fini
    void Datastructure2::removeAll( )
    {
        delete [] tampon;
        delete [] database;
    }

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Lorsque l'on manipule des ressources dans une classe, il faut bien veiller à les gérer correctement. En l'occurence tu as oublié :

    - D'initialiser toutes tes ressources dans le constructeur (mettre tampon à NULL)
    - Un constructeur par copie
    - Un opérateur d'affectation

    Ensuite, je crois que tu as au moins une erreur d'indice, ce qui pourrait aussi expliquer le plantage.

  3. #3
    Membre à l'essai

    Inscrit en
    Juillet 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 23
    Points : 23
    Points
    23
    Par défaut
    merci de ta réponse rapide Loulou,
    mais qu'entends tu par : un constructeur par copie et un opérateur d'affectation ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Datastructure2(const Datastructure2&);
    Datastructure2& operator =(const Datastructure&);
    Poue éviter les erreurs si tu fais ça par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Datastructure2 d1;
    Datastructure2 d2(d1);
    d2 = d1;
    Ensuite autre chose que je n'avais pas vu : lorsque tu recrées tes tableaux tampon et database, tu oublies de les détruire au préalable.

  5. #5
    Membre à l'essai

    Inscrit en
    Juillet 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 23
    Points : 23
    Points
    23
    Par défaut
    j'ai resolu le probleme grace a topn aide, merci Loulou

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

Discussions similaires

  1. Allocation de mémoire dynamique et tableaux
    Par Merillym dans le forum Débuter
    Réponses: 10
    Dernier message: 07/10/2009, 19h13
  2. Bug avec allocation dynamique de tableaux
    Par yann_m dans le forum Fortran
    Réponses: 3
    Dernier message: 17/02/2009, 11h36
  3. Réponses: 6
    Dernier message: 12/11/2008, 17h29
  4. Erreur d'allocation dynamique de tableaux
    Par lclclc dans le forum Fortran
    Réponses: 1
    Dernier message: 02/04/2008, 15h10
  5. allocation dynamique et tableaux de pointeurs
    Par gbardy dans le forum 4D
    Réponses: 3
    Dernier message: 06/07/2006, 11h08

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