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 :

Problème avec les vector


Sujet :

C++

  1. #1
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 177
    Points : 321
    Points
    321
    Par défaut Problème avec les vector
    Bonjour! En regardant sur le net et dans la FAQ de developpez.com pour me documenter là-dessus, j'ai mis en pratique dans mon cas et j'ai voulu tester ce que ça donne pour la création d'un tableau dynamique dans une classe, mais je reçoit un segmentation fault! Car il me dit qu'il n'est pas initialiser.

    Classe TestVector.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class TestVector
    {
    public:
        TestVector();
        virtual ~TestVector();
     
        void showStringValue();
     
    private:
        vector<string> stringValue;           // En lisant sur les vector, ils disent que c'est déjà initialiser.
    };
    Classe TestVector.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
     
    TestVector::TestVector()
    {
     
        // Segmentation fault
        this->stringValue[0] = "Test01";
        this->stringValue[1] = "Test02";
        this->stringValue[2] = "Test03";
        this->stringValue[3] = "Test04";
        this->stringValue[4] = "Test05";
    }
     
    TestVector::~TestVector()
    {
              // Comment fait-on pour détruire un vector?
    }
     
    void TestVector::showStringValue()
    {
        for(int i = 0; i < this->stringValue.size(); i++)
        {
            cout << this->stringValue[i] << endl;
        }
    }
    Classe Program.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main(int argc, char** argv)
    {
        TestVector* mTestVector = new TestVector();
     
        mTestVector->showStringValue();
     
        delete mTestVector;
     
        return (EXIT_SUCCESS);
    }
    Je me doutais que ce n'était pas aussi simple, mais j'ai voulue me débarrassais de mes vieilles habitudes et m'orienter de plus en plus sur la programmation objet.

    Et je voulais savoir ce que c'était le data "clip.data()", car je suis dans un projet SDL, mais en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vector<SDL_Rect> clip;
    SDL_BlitSurface(source, clip.data(), SDL_GetVideoSurface(), &offset);
    Je n'ai plus eu d'erreur à la compilation. Donc je me demandé à quoi ça pouvais servir. Merci d'avance pour votre aide.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    Salut

    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
     
    TestVector::TestVector()
    {
        this->stringValue.append("Test01");
        this->stringValue.append("Test02");
        this->stringValue.append("Test03");
        this->stringValue.append("Test04");
        this->stringValue.append("Test05");
    }
     
    TestVector::~TestVector()
    {
        // Rien a faire, le destructeur de vector<> gere tout
    }
     
    void TestVector::showStringValue()
    {
        for(int i = 0; i < this->stringValue.size(); i++)
        {
            cout << this->stringValue[i] << endl;
        }
        // ou bien
        vector<string>::const_iterator it;
        for (it = stringValue.begin(); it != stringValue.end(); ++it) {
            cout << *it << endl;
        }
    }
    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
     
    int main(int argc, char** argv)
    {
        TestVector* mTestVector = new TestVector(); // pourquoi new ?
        mTestVector->showStringValue();
        delete mTestVector;
     
        // sans new
        TestVector testVector;
        testVector.showStringValue();
        // Pas besoin de supprimer ta classe, elle sera automatiquement
        // detruite à la fin du main
     
        return (EXIT_SUCCESS);
    }
    Pour la SDL, je n'y connais rien
    --
    Jérémie

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    A début, ton vecteur est vide. 2 solutions : Soit tu ajoutes des cases (push_back) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TestVector::TestVector()
    {
        this->stringValue.push_back("Test01");
        this->stringValue.push_back("Test02");
        this->stringValue.push_back("Test03");
        this->stringValue.push_back("Test04");
        this->stringValue.push_back("Test05");
    }
    Soit tu lui passe une taille initiale à la construction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TestVector::TestVector() : stringValue(5)
    {
     
        // Segmentation fault
        this->stringValue[0] = "Test01";
        this->stringValue[1] = "Test02";
        this->stringValue[2] = "Test03";
        this->stringValue[3] = "Test04";
        this->stringValue[4] = "Test05";
    }
    Pour le data, c'est probablement une façon d'accéder directement à la mémoire que gère le vecteur, mais ce n'est pas encore standard. Si on veut être conforme au standard C++98 on écrira plutôt (si le vecteur est non vide) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_BlitSurface(source, &clip[0], SDL_GetVideoSurface(), &offset);

  4. #4
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    D'abord :
    Citation Envoyé par jfouche Voir le message
    Salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        this->stringValue.append("Test01");
    append n'est pas dans l'interface de std::vector...

    Ensuite, à sa construction, le vecteur stringValue est vide. Or l'opérateur [] ne peut adresser que des éléments existant. C'est pour ça que tu as une exception au moment où tu essaies d'ajouter des éléments.
    Pour ajouter des éléments à un vecteur tu as plusieurs possibilités :
    1/ Tu peux utiliser la méthode 'push_back' : elle ajoute un élément à la fin de ton tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TestVector::TestVector()
    {
        // Nul besoin de préciser 'this'
        stringValue.push_back("Test01");
        stringValue.push_back("Test02");
        stringValue.push_back("Test03");
        stringValue.push_back("Test04");
        stringValue.push_back("Test05");
    }
    2/ Tu peux utiliser la méthode 'insert' : tu insères un élément à une position donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TestVector::TestVector()
    {
        stringValue.insert(stringValue.end(),"Test01");
        stringValue.insert(stringValue.end(),"Test02");
        stringValue.insert(stringValue.end(),"Test03");
        stringValue.insert(stringValue.end(),"Test04");
        stringValue.insert(stringValue.end(),"Test05");
    }
    3/ Tu peux utiliser l'opérateur [] ... à condition d'avoir créer des éléments par défaut auparavant avec 'resize' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TestVector::TestVector()
    {
        stringValue.resize(5); // création de 5 éléments
        stringValue[0] = "Test01";
        stringValue[1] = "Test02";
        stringValue[2] = "Test03";
        stringValue[3] = "Test04";
        stringValue[4] = "Test05";
    }
    A noter qu'avec un tableau, la méthode des 'insert' peut être assez inefficace car les données peuvent être déplacées si l'insertion ne se fait pas en fin.
    La méthode push_back avec reserve est généralement la plus claire et la moins dangereuse.
    Je t'invites à consulter un peu d'aide sur l'interface de std::vector.

  5. #5
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 177
    Points : 321
    Points
    321
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_BlitSurface(source, &clip[0], SDL_GetVideoSurface(), &offset);
    J'avais oublié que SDL prenais pas tout, mais seulement la partie à traiter dans le tableau.

    Citation Envoyé par jfouche Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
        TestVector* mTestVector = new TestVector(); // pourquoi new ?
     
    }
    --
    Jérémie
    Car je pensais que c'était une méthode dynamique.

  6. #6
    Membre chevronné
    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
    Points : 2 205
    Points
    2 205
    Par défaut
    Comme l'a dit (implicitement) 3Darchi t'es pas obligé de faire du this-> quand t'es dans une méthode de la classe. (après si c'est un choix alors fait comme tu veux xD).

    Sinon euh... une méthode dynamique?

  7. #7
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Tu as l'air de confondre allocation dynamique vs allocation statique avec methode static. Les premiers non pas grand chose avoir avec le second.

    Ici il s'agit plutôt de savoir si tu dois utiliser une allocation dynamique, sur le tas, avec new ou une allocation statique sur la pile. Et la réponse est : ça dépend !

    En fait, ça dépend essentiellement de la durée de vie que tu souhaites donner à ta variable (notion de valeur et d'existence) ou si tu dois faire du polymorphisme de classe (entre autre). Mis à part ces cas là (+ quelques autres) utilises de préférence l'allocation statique.

    A priori dans ton cas l'allocation statique convient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestVector* mTestVector = new TestVector();
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestVector mTestVector;
    tout simplement

    Pour plus d'info FAQ

  8. #8
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Et surtout, plus besoin de "delete" après une allocation statique (plus de new donc plus de delete).

  9. #9
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 177
    Points : 321
    Points
    321
    Par défaut
    Citation Envoyé par Floréal Voir le message
    Et surtout, plus besoin de "delete" après une allocation statique (plus de new donc plus de delete).
    J'ai remarqué ça! Car je me demandais si à la fin du programme, il appelé le destructeur. Ma fois ça me faisait peur ! Alors je les déboguer minutieusement et j'ai été rassuré , je l'ai vue passant par les destructeurs de chacun d'entre eux. Comme quoi .

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

Discussions similaires

  1. Problème avec les vector
    Par Kajan dans le forum Débuter
    Réponses: 11
    Dernier message: 03/07/2011, 23h21
  2. problème avec les vector
    Par cdm1024 dans le forum SL & STL
    Réponses: 8
    Dernier message: 15/04/2008, 10h57
  3. [Debutant] problème avec les vectors
    Par julien.63 dans le forum Langage
    Réponses: 6
    Dernier message: 21/12/2007, 22h53
  4. Problème avec les vector
    Par lostchina dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/03/2007, 10h51
  5. [gsoap] Problème avec les std::vector
    Par LePhasme dans le forum SL & STL
    Réponses: 1
    Dernier message: 25/04/2006, 11h46

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