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 :

Taille de vector


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Points : 11
    Points
    11
    Par défaut Taille de vector
    bonjour,

    je rencontre actuellement un problème qui me laisse dubitatif. tellement dubitatif que je suis persuadé que la solution est devant mes yeux, maisje n'arrive pasà la voir.

    voilà j'ai trois fichiers sources dans mon programme :
    - main.cpp
    - ombrage.cpp
    - global.cpp

    je remplis deux vectors dans le fichier ombrage : le vector "direct" et le vector "diffus". je vérifie qu'ils sont bien remplis dans le main: pas de pb. leur taille est bonne également.

    par contre dans global.cpp, il me met qu'ils sont nuls (taille égale à zero). c'est ça que je ne comprends pas.

    voilà mon main :

    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
    #include <string>
    #include <vector>
    #include <sstream>
    #include <iostream>
    #include <fstream>
    #include "cmath"
    #include "coordonnees.h"
    #include "ombrage.h"
    #include "global.h"
     
     
    using namespace std;
     
     
     
    vector< int> direct1 = get_direct();
    vector< int> diffus1 = get_diffus();
    vector< int> IntersectMap = get_global();
     
     
     
    int main()
    {
     
    cout << direct1.size() << ' ' ;
     
     
        return 0;
    }
    voilà mon global.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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <vector>
    #include <sstream>
    #include <iostream>
    #include <fstream>
    #include "cmath"
    #include "coordonnees.h"
    #include "ombrage.h"
    #include "global.h"
     
    using namespace std;
     
    vector< int> direct2 = get_direct();
    vector< int> diffus = get_diffus();
     
    void init_global(vector< int > &lightcolor)
    {
        int s;
    	s = direct2.size();
    	lightcolor.resize(s);
    	int index =0;
     
        lightcolor = diffus;
     
        cout << direct2.size()  << ' ';
     
    }
     
     
    const std::vector<int>& get_global(void)
     {
      static bool is_already_init(false);
      static std::vector<int> V;
     
      if ( !is_already_init ) {
        init_global(V);
     
        is_already_init = true;
      }
     
      return V;
    }
    donc direct1.size() vaut bien la bonne valeur , soit 2700
    tandis que direct2.size() vaut 0.

    je pense que je passe à côté de qque chose d'évident, là, c'est pas possible autrement

    merci pour votre aide!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    le code de "get_direct", SVP.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Ouah !! Ta fonction retourne un vecteur que tu recopies
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector< int> direct2 = get_direct();
    Passe le en référence, tu y gagneras probablement en performance et tu pourras gérer un code de retour en plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vector< int> direct2;
    if(get_direct(direct2) == false)
    {
       // erreur
    }
    et pareil pour les autres vecteurs
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    yep

    get_direct() et get_diffus() ont la même structure, avec qques différences dans les équations.

    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
    void init_diffus(vector< int > &lightcolor)
    {
    }
     
    const std::vector<int>& get_diffus(void)
     {
      static bool is_already_init(false);
      static std::vector<int> V;
     
      if ( !is_already_init ) {
        init_diffus(V);
     
        is_already_init = true;
      }
     
      return V;
    }
    l'intérieur de a fonction get_diffus() ou get_direct() n'est pas très important. et surtout très lourd.

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    ram-0000 j'ai pas compris ce que tu voulais dire. ma foncion ne retourne pas un vector, elle remplit un vector.

    et get_direct(direct2) n'a aucun sens.

  6. #6
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Il y a plusieurs manières d'avoir des valeurs de retour en C++.

    Soit, une valeur de retour traditionnelle, renvoyée par "return". Soit, un paramètre out, qu'on prend en le passant par référence.

    Par exemple :
    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
     
    std::vector<int> f1()
    {
       std::vector tmp;
       for(int i = 0; i < 10000; ++i)
          tmp.push_back(i);
       return tmp;
    }
     
    void f2(std::vector<int>& donneesARemplir)
    {
       for(int i = 0; i < 10000; ++i)
          donneesARemplir.push_back(i);
    }
     
    int main()
    {
        std::vector<int> a = f1();
        std::vector<int> b;
        f2(b);
        return 0;
    }
    Dans les deux cas, le vecteur sera bien rempli. Mais dans le premier cas, il sera rempli dans f1, puis recopié dans a au niveau de la ligne a = f1(). Dans le deuxième cas, il sera directement rempli dans b, ce qui est beaucoup plus performant puisqu'on évite une copie.

    C'est pour ça qu'on déconseille généralement de renvoyer des vecteur, et qu'on préfère les passer par référence.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    En exécutant le "code", j'ai 0 et 0.

    C'est logique, il n'y aucun remplissage dans le code que vous nous avez donné.

    Il y a beaucoup trop d'utilisation de global static interdépendante dans votre code.
    Avec le fait que vous n'avez aucun certitude sur l’ordre d’initialisation de vos global entre différente unité de compilation (fichier cpp) vous vous compliquez inutilement la vie.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/11/2009, 14h15
  2. std::vector, taille du vecteur-> quel fonction
    Par toutounesan dans le forum C++
    Réponses: 3
    Dernier message: 11/09/2007, 15h43
  3. [DEBUTANT]taille mini de Vector = 0 ?
    Par Battosaiii dans le forum SL & STL
    Réponses: 4
    Dernier message: 14/12/2006, 18h00
  4. Taille d'un tableau de vector
    Par Fred2209 dans le forum SL & STL
    Réponses: 4
    Dernier message: 15/11/2006, 16h27
  5. [JSTL] <c:when> Test sur la taille d'un Vector
    Par Stessy dans le forum Taglibs
    Réponses: 8
    Dernier message: 14/06/2006, 14h40

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