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 :

probleme convertion double * => const double (&)[]


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut probleme convertion double * => const double (&)[]
    Bonsoir à tous,

    J'aimerais savoir pourquoi ce bout de code ne compile pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	std::vector<double[4]>* toto = new std::vector<double[4]>;
     
    	double *tmp = new double[4];
    	tmp[0]=0;
    	tmp[1]=1;
    	tmp[2]=2;
    	tmp[3]=3;
     
    	toto->push_back(tmp);
    Erreur : error C2664: 'std::vector<_Ty>::push_back'*: impossible de convertir le paramètre 1 de 'double *' en 'const double (&)[4]'

    Comment resoudre cette erreur, merci par avance.

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<double*>* toto = new std::vector<double*>;
    Ceci fonctionnera. Le vecteur n'a pas à savoir combien de double tu aura dans ton tableau, il n'allouera rien du tout. Tu lui donne l'adresse de ton tableau et quand tu lui demanderas le premier tableau donc
    Il te renverras l'adresse de tmp.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Le problème vient, tout simplement, du fait que la classe std::vector ne doit pas être utilisée comme tu le fais

    Il s'agit d'une classe qui encapsule directement tout ce qu'il faut pour gérer une collection d'objets contigus en mémoire, et donc, tu peux te contenter d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<doule> tab(4);
    qui contiendra alors d'office 4 double.

    Tu pourra (bien que ce ne soit pas forcément conseillé)après utiliser la variable tab exactement comme tu en as l'habitude en C, sous une forme proche de
    Si tu as vraiment besoin de récupérer un pointeur sur le premier élément (ce qui n'est pas vraiment conseillé non plus ), il s'agira par contre de prendre l'adresse du premier élément, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double * ptr = &tab[0];
    Si je dis que ce n'es tpas forcément conseillé, c'est parce que la classe std::vector propose, en plus de l'interface "classique" associées au tableaux "C style" des itérateurs, dans leur version constante et non constante et une série de fonctions qui nous permettent de les manipuler.

    L'idéal étant d'utiliser ces itérateurs, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(std::vector<double>::iterator it=tab.begin(); // récupère l'itérateur 
                                                      // sur le premier élément
        it != tab.end(); // tant que l'itérateur ne correspond pas à "
                         // ce qui suit le dernier élément"
        ++it /* on n'oublie pas l'incrémentation ;-) */ )
    {
        /* ce qu'il faut faire
    }
    De manière alternative, tu peux, si tu ne sais pas d'office le nombre d'élément que devra contenir ton tableau (ce qui, en pratique, est souvent le cas), profiter de la fonction membre push_back:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<double> tab; /* création d'un tableau "vide" */
    tab.push_back(3.1415926);
    tab.push_back(6.02-23);
    tab.push_back(22.6);
    /*...*/
    tout l'aspect de la gestion dynamique de la mémoire étant automatiquement pris en compte par la classe "him self"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    T[N] n'est pas copiable.

    std::vector<std::array<double,4>> v;

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci à tous les 3 pour vos réponses complémentaires !
    Je pense que je vais retenir la proposition d'Astraya. C'était ma "seconde" option.
    @koala01: merci bien pour ton développement. (même si tu m'as détaillé la démarche pour un vector contenant 4 doubles alors que mon problème concerne un vector contenant des double[4] )
    @Joel F: Je n'ai pas l'habitude de travailler avec les arrays, je saurais y penser à l'avenir

  6. #6
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Ce que j'ai proposé n'est pas la meilleur solution attention, c'est une solution simple et qui ne change rien dans le reste de ton code.
    Mais ce n'est pas la solution recommandée.

    Celle de Joël répond à tes besoins en mieux!

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    En fait, Joel propose de faire un talbeau d'array de double, ce qui revient, en gros, à créer un tableau bi dimensionnel (dont la taille de la deuxième dimension est connue à la compilation).

    Or, d'après ce que j'ai compris, azboul veut simplement avoir... un tableau de double

    Il faut donc, selon le cas
    • Soit recourir à std::vector<double>, si le nombre de double qu'il faudra placer est déterminé de manière dynamique
    • Soit recourir à std::array (std::tr1::array ou boost::array si pas en C++0x) si le nombre de double à utiliser est connu comme constante à la compilation.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    je repondais juste à ce que je pensais de la tentative du PO

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par Joel F Voir le message
    je repondais juste à ce que je pensais de la tentative du PO
    Je me doute bien

    Mais j'ai vraiment l'impression que le PO ne demande que le moyen de gérer un tableau mono dimensionnel (à cause des accès qu'il tente par la suite dans le code), alors que, visiblement, tu as l'impression qu'il souhaite géer un tableau bi dimensionnel

    J'ai l'impression qu'il envisage la classe vector comme une "enveloppe" des éléments, peut être bien à l'instar des pointeurs intelligents, pourquoi pas ?

    Et donc, azboul, pourrais tu nous confirmer que ton objectif est, bel et bien, de gérer un tableau n'ayant qu'une seule dimension
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    PO?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/01/2007, 13h39
  2. Réponses: 20
    Dernier message: 23/01/2007, 15h34
  3. convertion chaine de caractere/double
    Par kamouminator dans le forum C
    Réponses: 8
    Dernier message: 07/11/2006, 10h31
  4. [TPW] Petit problème pour réaliser un pendule double
    Par lapin59 dans le forum Turbo Pascal
    Réponses: 39
    Dernier message: 02/05/2006, 11h18
  5. Problème ecriture grub.conf pr double boot
    Par peppena dans le forum Administration système
    Réponses: 1
    Dernier message: 02/12/2005, 13h44

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