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 :

std::make_array pour c++14 ?


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Points : 106
    Points
    106
    Par défaut std::make_array pour c++14 ?
    Bonjour à tous!

    Quelqu'un sait-il s'il existe une proposition pour std::make_array pour le futur standard c++? En effet il existe déjà make_tuple par exemple qui permet de déduire automatiquement le nombre d'argument, ce qui se révèle particulièrement intéressant!

    Le site http://www.meetingcpp.com/index.php/start.html qui recense pas mal de paper ne mentionne rien à ce sujet là!

    Merci beaucoup à tous!

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Bonjour,

    On peut déjà faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::array<float, 5> a1 = {{0.1, 0.2, 0.3, 0.4, 0.5}}; // possible en C++11
    std::array<float, 5> a2 = {0.1, 0.2, 0.3, 0.4, 0.5}; // suggéré pour la prochaine norme
    Tu voudrais pouvoir écrire quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    auto a1 = std::make_array({0.1, 0.2, 0.3, 0.4, 0.5});
    // ... ou: 
    auto a2 = std::make_array(0.1, 0.2, 0.3, 0.4, 0.5);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Points : 106
    Points
    106
    Par défaut
    Exactement! Je souhaiterais faire cela en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    auto my_array = std::make_array(
        1,
        2,
     
    #if defined (MY_DEFINE)
        3,
    #endif
     
        4);
     
        for(auto const i& : my_array)
            // some code ...
    Sachant que le code qui suit la déclaration et l'initialisation de my_array ne dépend en aucun cas du nombre d'éléments! Il reste donc valide!

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Salut,

    Cette syntaxe ne fonctionnerait pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    auto my_array = {{
        1,
        2,
     
    #if defined (MY_DEFINE)
        3,
    #endif
     
        4}};
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Points : 106
    Points
    106
    Par défaut
    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
    #include <array>
     
    int main()
    {
        auto my_array = {{
            1,
            2,
     
        #if defined (MY_DEFINE)
            3,
        #endif
     
            4}};
     
        for(auto &i : my_array)
        {
        }
    }
    Erreur de la part du compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    g++ -o main.o -c main.cpp -W -Werror -Wall -Wfatal-errors -pedantic -pedantic-errors  -std=c++11
    main.cpp: In function ‘int main()’:
    main.cpp:13:11: error: unable to deduce ‘std::initializer_list<_Tp>’ from ‘{{1, 2, 4}}4}};
               ^
    compilation terminated due to -Wfatal-errors.
    make: *** [main.o] Error 1
    P.S. La sortie bizarre c'est gcc 4.8

  6. #6
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Voilà une implémentation qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T, typename ... Args>
    auto make_array(T t, Args ... args) -> std::array<T, sizeof...(Args)+1> {
        return std::array<T, sizeof...(Args)+1>({{t, args...}});
    }
    Il ne te reste plus qu'à écrire la proposition

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Voila une idée à garder sous la main.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Je ne vois pas l'interet de make_array si il ne permet pas de definir la taille dynamiquement, au runtime.

  9. #9
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Je ne vois pas comment tu pourrais utiliser une syntaxe comme celle-ci avec un nombre d'argument défini au runtime. Autrement dit, qu'écrirais-tu ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    auto a = make_array(...);
    Sinon, l'intérêt de std::array est justement d'avoir un tableau de taille fixe et connue à la compilation. Pour une taille fixe mais connue au runtime, il faudrait aller voir du côté de std::dynarray (également proposée pour la prochaine norme). Mais tu peux y perdre en performance, j'imagine, car le compilateur a d'avantage de liberté quand la taille du tableau est connue à la compilation.

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Dans int tab[]={1,2,3}; le compilateur connait la taille, pourquoi ne le pourrait-il pas pour make_array({1,2,3});?

    L'objectif de std::array est d'avoir la sécurité d'une classe autour d'un tableau crocheteux.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Je ne vois pas l'interet de make_array si il ne permet pas de definir la taille dynamiquement, au runtime.
    Un std::array dont la taille est déterminée au runtime s'appelle un std::vector

    J'aillais dire qu'un make_array() n'est pas nécessairement une bonne chose, mais en même temps, je me suis dit ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::array<????, 2> array = { 
      [](int n) -> bool { return n & 1 ? true : false; },
      [](int n) -> bool { return n & 1 ? false : true; }
    };
    Quel est le type ???? ?

    En gros, make_array() pour des int, float, ... n'a pas grand intérêt. Mais si on complexifie le type stocké, alors ça peut devenir intéressant d'utiliser le mécanisme de déduction de type proposé par le standard C++ en conjonction avec auto. Si on fabrique un array de lambda, c'est même obligatoire (et un array de lambda peut permettre de faire des choses originales).

    Citation Envoyé par Klaim
    Voilà une implémentation qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<typename T, typename ... Args>
    auto make_array(T t, Args ... args) -> std::array<T, sizeof...(Args)+1> {
        return std::array<T, sizeof...(Args)+1>({{t, args...}});
    }
    Il ne te reste plus qu'à écrire la proposition
    Je pencherais plutôt pour l'utilisation d'une liste d'initialiseurs (chrome me propose de changer ce mot par "administrationaliser" ; bien joué, chrome...). Tous les arguments sont de même type après tout.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  12. #12
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Je ne pense pas qu'il soit possible d'avoir une liste d'initialisation {...} comme argument de make_array (si l'objectif est bel et bien de créer un std::array). Les deux prototypes possibles seraient :
    • std::array<T,N> make_array(std::initializer_list<T> v), mais il est impossible de déterminer automatiquement N (limitation de std::initializer_list, je trouve ça dommage d'ailleurs),
    • ou encore std::array<T,N> make_array(const T (&v)[N]), mais je n'arrive pas à faire en sorte que le compilateur déduise automatiquement T et/ou N. Quand bien même ce serait possible, la seule manière de construire un std::array à partir de là serait de faire une boucle et d'assigner les éléments uns à uns. Ça peut paraître plus lourd à première vue, mais (avec toutes les optimisations activées) gcc me génère le même assembleur qu'avec le premier code que j'ai posté. Sans optimisation, il exécute la boucle aveuglément, ça sera donc moins performant.


    Si on se fiche d'avoir une taille connue à la compilation, alors le problème de l'OP ne se pose plus, et on peut écrire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<float> v = {
        1.0f,
    #ifdef TODO
        2.0f,
    #endif
        3.0f
    };
    Pas besoin d'un make_array ici.

  13. #13
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    comment ca, impossible?
    Et std::initializer_list::size(), c'est pour quoi faire, dans ce cas?

    A tout hasard, une breve question à Notre-Ami-a-Tous (c++11 make_array) m'a donné ceci (github) et cela (stackoverflow)

    et aussi une boost proposal
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Points : 106
    Points
    106
    Par défaut
    Je pense qu'il voulait dire que std::initializer_list::size() ne peut pas être utiliser pour déduire l'argument N de std::array<T, N>.

  15. #15
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Exactement. La taille d'une std::initializer_list<T> n'est pas un paramètre template, et std::initializer_list<T>::size() n'est pas constexpr.
    Les version qui sont citées dans le dernier post de leternel reposent sur le même principe que ce que j'ai proposé, si ce n'est qu'elles sont plus complètes et plus performantes (perfect forwarding).

  16. #16
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Un std::array dont la taille est déterminée au runtime s'appelle un std::vector
    Oui mais en meme temps je n'ai pas parle d'allocation.
    Le debat a lieu en ce moment dans le groupe de discussion du standard a propos de dynarray, comme quoi il devrais allouer sur la pile ou sur le tas...

    Perso, tant que je peux allouer une quantitee fixe et etre garanti que ca ne bougera jamais, ca m'eviterai d'avoir a construire des helpers autour de std::vector.

  17. #17
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Un std::array dont la taille est déterminée au runtime s'appelle un std::vector
    Pas nécessairement, tu peux vouloir un conteneur dont la taille est fixée à la construction sans pour autant que cette taille ne soit connu lors de la compilation (par ex. si elle est lue en conf).

    Ce n'est pas quelque chose dont j'aurais besoin tout les jours mais je conçois que l'on puisse avoir ce besoin.

  18. #18
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    En gros, make_array() pour des int, float, ... n'a pas grand intérêt. Mais si on complexifie le type stocké, alors ça peut devenir intéressant d'utiliser le mécanisme de déduction de type proposé par le standard C++ en conjonction avec auto. Si on fabrique un array de lambda, c'est même obligatoire (et un array de lambda peut permettre de faire des choses originales).
    C'est possible un array de lambda ? (ça devrait, mais impossible de compiler chez moi, ni sur VS2012, ni sur gcc 4.8.0)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<typename T, typename ... Args>
    auto make_array(T t, Args ... args) -> std::array<T, sizeof...(Args)+1> {
    	return std::array<T, sizeof...(Args)+1>({{t, args...}});
    }
     
    int main() {
    	auto f = [](int i)->int { return i; };
    	auto f2 = [](int i)->int { return i*2; };
     
    	std::array<decltype(f), 2> arr = {{ f, f2 }};
    	auto arr2 = make_array(f, f2);
     
    	return 0;
    }
    Mais au moins l'erreur est originale
    il n'existe aucune conversion définie par l'utilisateur appropriée de "lambda []int (int i)->int" en "lambda []int (int i)->int"

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par gl Voir le message
    Pas nécessairement, tu peux vouloir un conteneur dont la taille est fixée à la construction sans pour autant que cette taille ne soit connu lors de la compilation (par ex. si elle est lue en conf).
    C'est exactement ce que fait vector, il a même un constructeur fait pour ça : std::vector(size_type n);
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  20. #20
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Bousk Voir le message
    C'est exactement ce que fait vector, il a même un constructeur fait pour ça : std::vector(size_type n);
    Non ce n'est pas exactement ce que fait vector. La taille n'est pas fixée à la construction.
    Tu peux certes réserver une certaine taille à la construction (ou via un appel à reserve()) mais cela ne fixe pas la taille définitivement, celle-ci est susceptible d'évoluer par la suite (construit un vector d'une taille 10 et insère 11 éléments par push_back : ça fonctionne très bien et la taille du vector est bel et bien supérieure à 10).
    Fondamentalement, la taille d'un vector est dynamique. Un array a fondamentalement une taille fixe lui mais cela ne signifie pas nécessairement que celle-ci doit être connu à la compilation (comme dans le cas de std::array), il est tout à fait envisageable de souhaiter un array (avec une taille fixe donc) dont la taille n'est connue qu'au runtime (n'est-ce pas la raison d'être des VLA en C ? Même si je n'apprécie pas la façon dont ils sont définis, il remplisse bel et bien ce rôle).

Discussions similaires

  1. Utilisation de std::function pour créer un bouton
    Par Glân von Brylân dans le forum SL & STL
    Réponses: 19
    Dernier message: 28/09/2014, 17h12
  2. std::allocator pour char et wchar_t
    Par Meseira dans le forum SL & STL
    Réponses: 6
    Dernier message: 24/04/2013, 14h20
  3. Problème avec std::stringstream pour lire un fichier OBJ
    Par Kromagg dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 01/12/2010, 18h49
  4. prédicat pour min_element d'une std::map
    Par Kurisu dans le forum SL & STL
    Réponses: 6
    Dernier message: 11/09/2006, 19h27
  5. [débutant] equivalent à sprintf pour les std::string
    Par Biosox dans le forum SL & STL
    Réponses: 22
    Dernier message: 26/08/2005, 12h46

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