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++Builder Discussion :

vector.size() me semble étrange


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut vector.size() me semble étrange
    Bonjour à tous! (Bonsoir à nos amis de l'Europe!)

    Je me butte à un problème qui me désarsonne.

    J'ai un vecteur d'un class que j'ai créée. J'ai besoin de connaître sa longueur (elle change de façon dynamique) donc j'utilise la fonction .size() provenant de la librairie des vecteur ("vector.h").

    Je vous montre le code, il s'agit d'un bouton qui fait afficher la dimension du vecteur dans la boite de text "Edit1", et la contenu du 5ieme ( [4] ) élément du vecteur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void __fastcall TFPalette::Button1Click(TObject *Sender)
    {
     
    	Edit1->Text = porteListe.size();
    	Edit2->Text = porteListe[4].numero;
     
    }
    //---------------------------------------------------------------------------
    Bon il s'agit d'une fonction très simple juste pour exposer mon problème.

    Je vous montre aussi le fichier header :

    (enfin, la partie intéressante)

    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 boiteClass
    {
     
    	  public :
    			 int type;
    			float longueur;
    			float largeur;
    			AnsiString client;
    			AnsiString jobID;
    			int numero;
    			float surface;
    			vector<porteContenu> contenu;
    			vector<porteVide> espaceVide;
    			float surfaceDisponible;
    };
     
    	vector<boiteClass> boiteListe;
    Alors comme on peut voir dans l'image suivante, il me dit que la dimension est null, et que le contenu du vecteur en la position [4], que c'est 5, n'est pas contradictoire?

    Quelqu'un a déjà vue quelque chose de semblable?

    Je continue de chercher, ça me paraît impossible...


    Merci,

    Antoine

  2. #2
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Salut,
    non ce n'est pas impossible, utiliser le std::vector à beaucoup d'avantage par rapport à un vecteur normal, mais lorsque tu demande à accéder à un index du vector, il à le même fonctionnement qu'un vecteur normal, tu peut déborder, il t'affichera alors la valeur qu'il trouve à l'endroit ou il tombe, c'est pour cela qu'il faut toujours vérifier la taille avant d'essayer d'acceder à un index, histoire d'être sur que cet index existe.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    Je vois je vois,

    je savais pas qu'il y avait plusieurs type de vecteur (enfin...). Et comment je fais pour savoir si je suis en standard?

    Par dessus tout, le code que j'utilise (pour ce qui est des .size()) provient presque entièrement d'un ancien programme que j'avais fait et que je suis en train de renipper (qui est toujours fonctionnel).

    Et encore pire, j'ai d'autre vecteur qui utilise .size() qui fonctionne très bien. Alors, ça me pointe le problème ... l'utilisation du vecteur en question. Il doit y avoir un endroit où je l'efface ou je le modifie d'une façon...

    Enfin, j'avais déjà vécu des transfert de code plus facile disons.

    Merci de l'info à propos des différents type de vecteur, j'ai hate d'en savoir plus!

    Antoine

  4. #4
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Il y a pas vraiment plusieurs type, il y a les vecteur standard de type
    qui définit un vecteur de 15 case (0 à 14) de type int et il y a la classe vector de la stl, qui est aussi standard, mais qui elle est dynamic (on est pas obligé de definir le nombre de case du vector à la declaration et on peut modifier sa taille à tout moment)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<int> vector;
    si ton vector est vide (size renvoit 0) c'est effectivement que tu la effacé entre temps, cherche un endroit ou tu fait un clear de ton vector

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut 20h32 heure du québec
    Okay!

    Ce qui est intéressant dans mon cas, c'est que effectivement je faisais un .clear() de mon vecteur (fossile de tests antérieurs), mais la raison qui rendait cette situation difficile à trouver était que j'y mettais de l'information et ensuite je le nettoyais (.clear), mais pluisque le vecteur était dans le 'Global Scope' il avait toujours une place mémoire réservée, donc les informations précédemment enregistrées étaient toujours là et encore pire, valides. Donc, j'avais accès aux bonnes informations, mais il y avait seulement la fonction .size() qui ne fonctionnait pas!

    Enfin, une longue histoire pour un petit problème!

    Bonne fin de semaine!

    Antoine

  6. #6
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Bonjour,
    pour l'allocation mémoire, cela ne m'étonne pas, il me semble que le vector garde une partie de l'espace mémoire alloué précédemment après un clear, pour éviter de trop allouer-désallouer et donc de fragmenter la mémoire dès que vous faite une opération dessus, ainsi, il réalloura de la mémoire uniquement si il en à besoins de plus par la suite.

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

Discussions similaires

  1. Problèmes size vector et out of memory.
    Par NELLLY dans le forum MATLAB
    Réponses: 4
    Dernier message: 16/01/2013, 22h38
  2. vector::size() retourne une valeur négative
    Par MounaR dans le forum C++
    Réponses: 16
    Dernier message: 10/06/2011, 16h04
  3. Réponses: 5
    Dernier message: 15/07/2010, 10h14
  4. vector et push_back qui ne fait pas bouge le size
    Par skerdreux dans le forum SL & STL
    Réponses: 7
    Dernier message: 24/04/2008, 15h34
  5. [vector] erreur étrange
    Par Sp4ce dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 10/10/2007, 07h57

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