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 :

Compréhension de code


Sujet :

C++

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Compréhension de code
    Bonjour,

    je suis entrain de modifier le code du protocole DSR sous NS2 ,
    j'ai rencontré ce code dans le fichier Path.h
    et j'arrive pas à comprendre le constructeur ID, j'ai jamais vu une déclaration pareil..
    votre aide m'est vraiment précieuse.
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Struct ID
    {
    friend class Path;
    
    inline ID(const struct sr_addr &a): addr(a.addr), 
        type((enum ID_Type) a.addr_type), t(-1),
    link_type(LT_NONE),
    	  log_stat(LS_NONE)
    	{
    		assert(type == NONE || type == MAC || type == IP);
    	}
    -------
    Merci
    Bou

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ce ne sont pas des déclarations mais des initialisations des membres de la structure ID
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ID(const struct sr_addr &a) 
      : 
        addr(a.addr),                     // Initialisation de addr      à la valeur a.addr
        type((enum ID_Type) a.addr_type), // Initialisation de type      à la valeur a.addr_type
        t(-1),                            // Initialisation de t         à la valeur -1
        link_type(LT_NONE),               // Initialisation de link_type à la valeur LT_NONE
        log_stat(LS_NONE)                 // Initialisation de log_stat  à la valeur LS_NONE
    c'est ce que l'on appelle une liste d'initialisation.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Compréhension de code
    Bonjour,

    Merci beaucoup Winjerome.. pour cette réponse claire et efficace.

    Bou

  4. #4
    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
    Parce que visiblement, tu ne le sais pas encore, cette initialisation est importante.

    Cela permet de définir quel constructeur est appelé pour chaque membre, et avec quels arguments.
    Cela permet aussi de ne pas construire par défaut puis remplacer les membres.

    C'est important pour la manipulation de ressources, telles qu'une référence, un fichier, etc.

    En fait, pour une référence, c'est le seul moyen de la remplir.
    Le code suivant ne compile pas, car la référence n'est pas initialisée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class bidule {
        int& ref;
    public:
        bidule (int& r) {ref=r;}
    };
    Il faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class bidule {
        int& ref;
    public:
        bidule (int& r) : ref(r){}
    };
    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

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut compréhension du code
    Bonjour,

    merci Pierre ' leternel' pour ces informations intéressantes, c vrai que je savais pas ça.
    par la même occasion, pouvez vous m'aider sur ce code, je vous serez trés reconnaissante.

    En faite je suis entrain de modifier le code du protocle DSR dans NS2.

    il y un fichier Hdr_sr.h // qui décrit l’entête du packet.

    au début du fichier il y a la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct sr_addr {
        int addr_type;	 /* same as hdr_cmn in packet.h */
        nsaddr_t addr;
    
        /*
        * Metrics that I want to collect at each node
        */
        double	Pt_; // cette variable est déclaré dans la structure mais n'est pas utilisé
                                             // après. moi je veux changer le code pour qu'il la prenne en considération
    };
    et les attributs de la calsse Hdr_sr sont les suivants :

    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
    class hdr_sr {
        private:
        int valid_;	 /* is this header actually in the packet?
        and initialized? */
        int salvaged_;	/* packet has been salvaged? */
    
        int num_addrs_;
        int cur_addr_;
        struct sr_addr addrs_[MAX_SR_LEN];// c'est un tableau d'ID dont le type est la structure sr_adrr (décrite au début)
    
        struct route_request	sr_request_;
        struct route_reply	sr_reply_;
        struct route_error	sr_error_;
    
        struct flow_header sr_flow_;
        struct flow_timeout	sr_ftime_;
        struct flow_unknown	sr_funk_;
        struct flow_default_err sr_fdef_unk;
    ...}
    la fonction qui initialise le Tableau addrs_[MAX_SR_LEN] est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    inline void append_addr(nsaddr_t a, int type) {
        assert(num_addrs_ < MAX_SR_LEN-1);
        addrs_[num_addrs_].addr_type = type;
        addrs_[num_addrs_++].addr = a;
    }
    comme ici il n initialise pas le champs Pt_, j'ai modifié la fonction ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    inline void append_addr(nsaddr_t a, int type, double P) {
        assert(num_addrs_ < MAX_SR_LEN-1);
        addrs_[num_addrs_].addr_type = type;
        addrs_[num_addrs_].Pt_=P
        addrs_[num_addrs_++].addr = a;
    }
    dans un autre fichier (dsragent.cc) il appelle cette fonction pour l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void DSRAgent::testinit()
    {
        struct hdr_sr hsr;
        
        if (net_id == ID(1,::IP))
        {
            printf("adding route to 1\n");
            hsr.init();
            hsr.append_addr( 1, NS_AF_INET ); // je l ai remplacé par la nouvelle définition : hsr.append_addr( 1, NS_AF_INET, 0.07 ); 
            
            
            route_cache->addRoute(Path(hsr.addrs(),
            hsr.num_addrs()), 0.0, ID(1,::IP));
        }
    j'ai essayé après d'afficher le contenu du tableau addrs_[].Pt_ , ça m'affiche toujours des zéros .. comme si il prend pas en considération le champs Pt et il ne le remplie pas ..

    je suis bloqué dessus ça fais 3 semaines .. je suis à court d'idée..
    votre aide m'est vraiment très précieuse..
    merci d'avance

    ci-joint le fichier dont je vous ai parlé (hdr_sr.h )
    Fichiers attachés Fichiers attachés

  6. #6
    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
    Le code m'a l'air normal.

    Quand un affichage ne donne pas ce qu'on veut, c'est qu'on affiche autre chose.
    Soit parce ce que la valeur n'est pas celle qu'on croit, soit parce qu'on affiche une autre chose.
    Fais voir le code d'affichage, je ne serai pas surpris qu'il y ait une erreur dedans.
    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

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut probléme dans le code c++
    rebonjour ,

    voici la fonction ou j'effectue l'affichage, sachant que j'ai déjà affiché avant d'autres variables dans le même endroit.
    le code est assez complexe et long, c'est un fichier qui s'appelle Cmutrace.cc, (exécuté par le similateur).

    NB: lorseque j'affiche les autres attributs du tableau addrs de type sr_addr (add_type ou addr), ça marche mais lorsque j’affiche le champs Pt que je voulais exploiter ca me donne 0.00
    voici le code de la fonction :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    void
    CMUTrace::format_mac_common(Packet *p, const char *why, int offset)
    {
    hdr_sr *srh =  hdr_sr::access(p);
    
    	struct hdr_cmn *ch = HDR_CMN(p);
    	struct hdr_ip *ih = HDR_IP(p);
    	struct hdr_mac802_11 *mh;
    	struct hdr_smac *sh;
    	char mactype[SMALL_LEN];
    //add by me	
    	int typ;
           double ptran;
    
    
    	strcpy(mactype, Simulator::instance().macType());
    	if (strcmp (mactype, "Mac/SMAC") == 0)
    		sh = HDR_SMAC(p);
    	else
    		mh = HDR_MAC802_11(p);
    	
    	double x = 0.0, y = 0.0, z = 0.0;
           
    	char op = (char) type_;
    	Node* thisnode = Node::get_node_by_address(src_);
    	double energy = -1;
    	if (thisnode) {
    	    if (thisnode->energy_model()) {
    		    energy = thisnode->energy_model()->energy();
    	    }
    	}
    
    	// hack the IP address to convert pkt format to hostid format
    	// for now until port ids are removed from IP address. -Padma.
    
    	int src = Address::instance().get_nodeaddr(ih->saddr());
    
    	if(tracetype == TR_ROUTER && type_ == SEND) {
    		if(src_ != src)
    			op = FWRD;
    	}
    
    	// use tagged format if appropriate
    	if (pt_->tagged()) {
    		int next_hop = -1 ;
    		Node* nextnode = Node::get_node_by_address(ch->next_hop_);
            	if (nextnode) next_hop = nextnode->nodeid(); 
    
    		node_->getLoc(&x, &y, &z);
    
    		if (op == DROP) op = 'd';
    		if (op == SEND) op = '+';
    		if (op == FWRD) op = 'h';
    
    		sprintf(pt_->buffer() + offset,
    			"%c "TIME_FORMAT" -s %d -d %d -p %s -k %3s -i %d "
    			"-N:loc {%.2f %.2f %.2f} -N:en %f ",
    			
    			op,				// event type
    			Scheduler::instance().clock(),	// time
    			src_,				// this node
    			next_hop,			// next hop
    			packet_info.name(ch->ptype()),	// packet type
    			tracename,			// trace level
    			ch->uid(),			// event id
    			x, y, z,			// location
    			energy);				// energy
    
    		offset = strlen(pt_->buffer());
    		if (strcmp (mactype, "Mac/SMAC") == 0) {
    			format_smac(p, offset);
    		} else {
    			format_mac(p, offset);
    		}
    		return;
    	}
    
    
    	// Use new ns trace format to replace the old cmu trace format)
    	if (newtrace_) {
    	    
    	    node_->getLoc(&x, &y, &z);
    	    // consistence
    	    if ( op == DROP ) { op = 'd';}
    
    	        // basic trace infomation + basic exenstion
    
    	    sprintf(pt_->buffer() + offset,
    		   "%c -t %.9f -Hs %d -Hd %d -Ni %d -Nx %.2f -Ny %.2f -Nz %.2f -Ne %f -Nl %3s -Nw %s ",
    		    op,                       // event type
    		    Scheduler::instance().clock(),  // time
    		    src_,                           // this node
                        ch->next_hop_,                  // next hop
    		    src_,                           // this node
    		    x,                              // x coordinate
    		    y,                              // y coordinate
    		    z,                              // z coordinate
    		    energy,                         // energy, -1 = not existing
    		    tracename,                      // trace level
                        why);                            // reason
    
    	    // mac layer extension
    
    	    offset = strlen(pt_->buffer());
    	    if (strcmp(mactype, "Mac/SMAC") == 0) {
    		    format_smac(p, offset);
    	    } else {
    		    format_mac(p, offset);
    	    }
    	    return;
    	}
    
    //add by me
    
    
    typ = srh->addrs()[0].addr_type; // j'ai bien un affichage pour ce paramètre
    ptran = srh->addrs()[0].Pt_;
    
    
    #ifdef LOG_POSITION
            x = 0.0, y = 0.0, z = 0.0;
            node_->getLoc(&x, &y, &z);
    #endif
    	sprintf(pt_->buffer() + offset,
    #ifdef LOG_POSITION
    		"%c %.9f %d (%6.2f %6.2f) %3s %4s %d %s %d ",
    #else
    		"%c %f %d %f %.9f _%d_ %3s %4s %d %s %d",
    		//"%c %f %f/e-9 %f %.9f _%d_ %3s %4s %d %s %d",
    #endif
    		op,
    //add by me
    		ptran,
    		typ,
    		Scheduler::instance().clock(),
                    src_,                           // this node
    #ifdef LOG_POSITION
                    x,
                    y,
    #endif
    		tracename,
    		why,
    		
                    ch->uid(),                      // identifier for this event
    		
    		((ch->ptype() == PT_MAC) ? (
    		  (mh->dh_fc.fc_type == MAC_Type_Control) ? (
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_RTS) ? "RTS"  :
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_CTS) ? "CTS"  :
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_ACK) ? "ACK":
    		  //<zheng: add for 802.15.4>
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Beacon) ? "BCN"  :		//Beacon
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Command_AssoReq) ? "CM1"  :	//CMD: Association request
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Command_AssoRsp) ? "CM2"  :	//CMD: Association response
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Command_DAssNtf) ? "CM3"  :	//CMD: Disassociation notification
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Command_DataReq) ? "CM4"  :	//CMD: Data request
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Command_PIDCNtf) ? "CM5"  :	//CMD: PAN ID conflict notification
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Command_OrphNtf) ? "CM6"  :	//CMD: Orphan notification
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Command_BconReq) ? "CM7"  :	//CMD: Beacon request
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Command_CoorRea) ? "CM8"  :	//CMD: Coordinator realignment
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Command_GTSReq) ? "CM9"  :	//CMD: GTS request
    	          "UNKN") :
    		   (mh->dh_fc.fc_type == MAC_Type_Management) ? (
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_80211_Beacon) ? "BCN"  :
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_AssocReq) ? "ACRQ"  :
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_AssocRep) ? "ACRP"  : 
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_Auth) ? "AUTH"  :
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_ProbeReq) ? "PRRQ"  :
    		  (mh->dh_fc.fc_subtype == MAC_Subtype_ProbeRep) ? "PRRP"  :
    		  "UNKN") :
    		  "UNKN") :
    		 (ch->ptype() == PT_SMAC) ? (
    		  (sh->type == RTS_PKT) ? "RTS" :
    		  (sh->type == CTS_PKT) ? "CTS" :
    		  (sh->type == ACK_PKT) ? "ACK" :
    		  (sh->type == SYNC_PKT) ? "SYNC" :
    		  "UNKN") : 
    		 packet_info.name(ch->ptype())),
    		ch->size());
    	
    	offset = strlen(pt_->buffer());
    
    	if(tracetype == TR_PHY) {
    		format_phy(p, offset);
    		offset = strlen(pt_->buffer());
    		return;
    	}
    
    	if (strncmp (mactype, "Mac/SMAC", 8) == 0) {
    		format_smac(p, offset);
    	} else {
    		format_mac(p, offset);
            }
    	
    	offset = strlen(pt_->buffer());
    
    	if (thisnode) {
    		if (thisnode->energy_model()) {
    			// log detailed energy consumption
    			// total energy and breakdown in idle, sleep, transmit and receive modes
    			sprintf(pt_->buffer() + offset,
    				"[energie %f ei %.3f es %.3f et %.3f er %.3f] ",
    				thisnode->energy_model()->energy(),
    				thisnode->energy_model()->ei(),
    				thisnode->energy_model()->es(),				
    				thisnode->energy_model()->et(),
    				thisnode->energy_model()->er());				
    		}
            }
    }

  8. #8
    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 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    Si tu es absolument sur de toi sur la valeur que doit avoir ta variable, alors c'est le moment où j'employerais les data breakpoint. Terriblement efficace pour voir où, quand et comment est modifiée la valeur d'une variable.
    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.

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut code c++
    bonjour cyrille,

    Merci pour votre réponse, mais comment puis je utiliser le "data breakpoint" .. c'est un debuger c'est ca ?
    sachant que je suis entrain de compiler le code sous le simulateur de réseaux NS2

    Merci d'avance

Discussions similaires

  1. compréhension de code en asp
    Par bidule123456 dans le forum ASP
    Réponses: 1
    Dernier message: 21/08/2007, 11h12
  2. compréhension de code (passage à une autre page)
    Par kokokaine dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/05/2007, 11h02
  3. Réponses: 3
    Dernier message: 12/01/2007, 09h42
  4. [VB-Access]recset! Pb de compréhension de code
    Par sk8bcn dans le forum VBA Access
    Réponses: 5
    Dernier message: 15/12/2006, 15h26
  5. Compréhension du code
    Par Ivanelis dans le forum Assembleur
    Réponses: 3
    Dernier message: 12/06/2006, 12h08

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