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

Boost C++ Discussion :

Problème entre boost::array std::copy et les vector


Sujet :

Boost C++

  1. #1
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut Problème entre boost::array std::copy et les vector
    Bonjour à tous.

    J'ai un petit code, rien de bien compliqué mais ca plante quand même et je ne comprend pas pourquoi.

    Voici le code:
    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
     
    #include <algorithm>
    #include <iostream>
    #include <vector>
    #include <boost/array.hpp>
     
    //using namespace boost::assign;
    using namespace std;
     
    int main()
    {
    boost::array<int,5> array1;  array1.assign(42);
    std::vector<int> result;   
     
    copy(array1.begin(),array1.end(),result.begin());  //la ligne fautive
     
    cout<<"s: "<<result.size()<<endl;
     
     for(int i=0;i<result.size();i++)
    	cout<<result[i]<<" "<<i<<endl;
     
     return 0;
    }
    Comme indiqué, ca cplante sur std::copy et je en comprend pas pourquoi.
    Quelqu'un à t'il une idée ?

    Annexe:
    le backtrace de gdb:
    #0 0xb7da22f3 in memmove () from /lib/i686/cmov/libc.so.6
    #1 0x08048e36 in std::__copy<true, std::random_access_iterator_tag>::copy<int>
    ()
    #2 0x08048e71 in std::__copy_aux<int*, int*> ()
    #3 0x08048ea1 in std::__copy_normal<false, true>::__copy_n<int*, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > > ()
    #4 0x08048eed in std::copy<int*, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > > ()
    #5 0x08048a85 in main ()
    *Code compilé avec g++ 4.2.3 sous windows et linux.

    Merci.

    Edit: si je remplace le std::vector par un boost::array de taille suffissante, ca passe sans problème
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    oui il faut que ton vecteur sur lequel tu fais la copie ait la même taille que l'original.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result.resize( array1.size() );  //?
    Ou alors tu peux utiliser un back_inserter pour effectuer des push_back() chaque fois qu'il y a besoin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    typedef std::vector< int > IntVec;
     
    std::copy( array1.begin(), array1.end(), std::back_inserter< IntVec >( result ) );

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    je croyais que copy faisait appel à push_back mais non il copie betement sans vérification.

    Merci nikkos car en plus tu ma fait découvrir back_inserter.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    je croyais que copy faisait appel à push_back mais non il copie betement sans vérification.
    Et il appellerait push_back sur quel objet?

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    je croyais que copy faisait appel à push_back mais non il copie betement sans vérification.

    Merci nikkos car en plus tu ma fait découvrir back_inserter.
    d'ailleurs

    std::back_inserter( result )
    suffit à la place de

    std::back_inserter< type >( result )

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

Discussions similaires

  1. problème entre le fetchAll() et et le to Array()
    Par Thauglor dans le forum Zend_Db
    Réponses: 3
    Dernier message: 22/05/2008, 23h22
  2. Réponses: 2
    Dernier message: 19/03/2008, 11h25
  3. [JONAS][DEBUTANT] Problème entre le wsdl et les .xml
    Par everick dans le forum Services Web
    Réponses: 2
    Dernier message: 22/11/2006, 18h29
  4. [Tableaux] Problème avec un array et les pseudo frame
    Par azerty53 dans le forum Langage
    Réponses: 6
    Dernier message: 10/05/2006, 14h57

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