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

Langage Delphi Discussion :

À quoi sert le mot-clé program


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut À quoi sert le mot-clé program
    Bonjour !

    Je me demandais à quoi sert le mot-clé program. Est-ce simplement un vestige du Pascal des origines, ou a-t-il encore une fonction ?

    J'ai remarqué que si j'essaie de compiler le programme suivant, j'obtiens une erreur (avec XE2) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    program Y;
     
    var
      y: integer;
     
    begin
    end.
    Le message d'erreur est : "[DCC Error] Y.dpr(4): E2004 Identifier redeclared: 'y'"

    Le compilateur prend donc vraiment en compte le nom du programme ; mais pour en faire quoi ? J'ai également observé qu'avec Free Pascal, le même code se compile sans message d'erreur. D'ailleurs avec ce compilateur le mot-clé program n'est même pas obligatoire.

    Dernière observation, je pensais que le nom du programme devait nécessairement correspondre au nom du fichier, vu que Delphi donne automatiquement le même nom à l'un et à l'autre ; mais je viens de m'apercevoir que si après avoir créé le programme suivant,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    program Project1;
     
    begin
    end.
    je change manuellement le nom du fichier en "Project-1.dpr", le programme se compile sans erreur et donne un fichier nommé "Project-1.exe". Du coup je reviens à ma question initiale : à quoi sert le mot-clé program et à quoi sert l'identifier qui le suit ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 688
    Points : 15 019
    Points
    15 019
    Par défaut
    Question existentielle à pas d'heure,

    Citation Envoyé par Roland Chastain Voir le message
    Dernière observation, je pensais que le nom du programme devait nécessairement correspondre au nom du fichier, vu que Delphi donne automatiquement le même nom à l'un et à l'autre ; mais je viens de m'apercevoir que si après avoir créé le programme suivant,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    program Project1;
     
    begin
    end.
    je change manuellement le nom du fichier en "Project-1.dpr", le programme se compile sans erreur et donne un fichier nommé "Project-1.exe". Du coup je reviens à ma question initiale : à quoi sert le mot-clé program et à quoi sert l'identifier qui le suit ?
    Ah tiens, c'est pas banal ce test et tu es bien curieux

    Alors ce que je sais, c'est que si tu veux coder une dll tu mettras library à la place de program, et pour répondre à la seconde question, à quoi sert l'identifier qui le suit ?, j'aurais dit à l'identifier (ben vi ) mais vu ton test, je ne sais plus que dire, sinon qu'on va attendre les autres
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    Merci pour ta réponse, Jipété. Je vois que je ne suis pas le seul à être devant mon clavier à des heures impossibles.

    Sur ce, je crois que je vais quand même aller dormir. Bonne nuit !
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 626
    Points : 10 542
    Points
    10 542
    Par défaut
    Lis la documentation ou

    Donc, en jetant un œil, c'est un truc "à l'Embarcadero": on te force à avoir 1 et 1 seul "program" pour plusieurs unités, qui est l'unité principale (avec une extension .dpr), et le nom du "program" est le nom de l'exécutable.

    Cela me fait penser à C++ Builder : le nom du projet c'est le nom de l'exécutable est cela est IMMUABLE.

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    @foetus

    Merci pour ta réponse. Si je comprends bien ce que je lis dans la page en question, l'identifier (l'identifiant ?) servirait plus à Delphi qu'au programme lui-même :

    For applications developed using Embarcadero tools, the identifier must match the project source file name.
    D'ailleurs, ce que dit la documentation sur ce point n'est pas absolument vrai, puisque (comme je l'ai dit précédemment), le nom du fichier source peut être différent et même ne pas être un identifier valide (voir capture d'écran, essai effectué avec XE2).

    Une autre chose que j'ai relevée (même si cela s'éloigne un peu de ma question), c'est l'extension du fichier, qui ne peut être que DPR. Jusqu'à Delphi 7 au moins, le fichier source du programme pouvait porter l'extension PAS (voir autre capture d'écran).

    J'ai relevé aussi la phrase où il est question du namespace. Du coup j'ai enfin trouvé un usage à l'identifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    program Project1;
     
    var
      i: integer;
     
    begin
      Project1.i := 0;
    end.
    Images attachées Images attachées   
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 626
    Points : 10 542
    Points
    10 542
    Par défaut
    Je pense que tu te fourvoies ... mais je ne peux pas vérifier

    Le fichier .dproj est un fichier de configuration de projet (ouvres le, tu verras qu'il n'y a pas de source).
    Alors que le fichier .dpr est bien un fichier source qui est le point d'entrée du programme.

    Moi ce que je comprends c'est que
    1. Il y a une triptyque forcée entre l'identifiant program, le nom du source "main" et le nom de l'exécutable.
    2. Le mot clef program va être remplacé par des inclusions d'entêtes et configurer des paramètres du projet: "you need not explicitly use any units in a project, but all programs automatically use the System unit and the SysInit unit"


    Donc tes tests fonctionnent parce que , peut-être, 1) tu n'as pas essayé de la réouvrir ton projet (je pense à une erreur impossible d'ouvrir Projet-1.dpr) 2) tu n'as qu'un seul source

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    @foetus

    Merci pour ta réponse.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    ça n'a pas toujours été vrai (je ne sais plus depuis quand ça l'est), mais le mot clé program défini l'espace du nom du source au même titre que le nom d'une unité.

    démonstration:
    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
     
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    var
      s: string;
     
    procedure test;
    var
      s: string;
    begin
      s := 'variable locale';
      WriteLn('s local = ', s);
      WriteLn('s global = ', Project1.s);
    end;
     
    begin
      s := 'variable globale';
      test();
      ReadLn;
    end.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 482
    Points : 2 733
    Points
    2 733
    Billets dans le blog
    10
    Par défaut Un apport historique
    En réalité ce mot clé est le début de la première branche d'un programme Pascal qui comme la définition en est donnée :
    Le Pascal Objet est un langage compilé à types stricts qui gère la conception structurée et orientée objet

    Sans ce principe qui est celui de tout langage similaire comme le langage C et ses descendants il n'est pas possible de compiler de grands programmes. J'ai personnellement travaillé sur des programmes > 2 000 000 de lignes de codes.

    Tu peux faire un parallèle avec l'architecture. Tu as du préfabriqué pour la construction courante mais tu ne bâtit pas une tour à Dubaï avec ces matériaux et sans principes structurants.

    Voici un programme brut de fonderie que j'avais écris en 1988 . n.b. J'ai écrit mon premier programme Pascal en 1981 ...

    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
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
     
    program   trdsimul;     (* 20 janvier 1988, 11 h 00 *)
    (* traduit d'assembleur en simulateur
          Fichiers d'entr‚e
             .REC en hexad‚cimal
                extraire autant de fichiers.ABS que d'ORG nouvelles.
                cr‚er le fichier BATCH chargeant ces fichiers successifs.
             .LST listing.
                n'extraire que la table des symboles.
          Fichiers en sortie
             nomfichier.BAT (nom pass‚ en paramŠtre sur ligne de commande)
             F1.ABS, F2.ABS, etc.ABS
          INITIALISER
             ramasser argument sur ligne de commande.
             ouvrir Lecture Arg.LST
             ouvrir Lecture Arg.REC
             Ouvrir Ecriture F1.ABS
             Ouvrir Ecriture Arg.BAT
    *)
     
    Const
    LongSpecPath = 24;
    LongSpecFic  = 28;   (* 24 + 4 *)
     
    type
    Param = string[LongSpecPath];
    SpecFic = string[LongSpecFic];
    chaine = string[255];
    octet = string[3];
    mot = string[5];
    FSpec = string[6];
    SymAss = string[8];  (* 8 CaractŠres significatifs *)
    NomDos = string[12];
     
    Const
    Fabs : array[1 .. 9] of FSpec =
    ('F1.ABS','F2.ABS','F3.ABS','F4.ABS','F5.ABS','F6.ABS','F7.ABS','F8.ABS','F9.ABS');
     
    var
    Nomrepert : string [20] ;
    Nomfich, DebPath : Param;
    RecFile, LstFile, BatFile : Text;
    FFile : file of byte ;
    FFic : SpecFic;
    Interrog, ACopier_, NouvLign :chaine;
    Long_  : octet;
    Adre_  : mot;
    Symb, Adres : SymAss;
    Nom    : NomDos;
    Longr, PrecLongr, RapErr, PrecAdresse, NouvAdresse, Decal, IndexF :  Integer;
    Longl, Lon, FinPath, Bl, Ch, IndexSortie, NbEntry, Compte, I : Integer;
    Longr1 : byte ;
    Debut (*, PremLign *) : boolean;
     
     
    BEGIN      (* initialisations *)
    Writeln ('Conversion du format Motorola S1-S9 en format binaire + Symboles') ;
    Debut := true;
    (* PremLign := true; *)
    (* Nomfich := Paramstr(1); *)
     
    getdir(0,Nomrepert) ;
    If ParamCount > 0 Then Interrog  := Paramstr(1) Else begin
       write ('Nom du fichier … traiter ? ') ;
       readln (Interrog) ;
    end ;
    FinPath   := Pos(':',Interrog);
    NomFich   := Copy(Interrog, succ(FinPath), 8);
    If FinPath > 1 Then DebPath   := Copy(Interrog, 1, FinPath)
                   Else DebPath := '';
    Nom := NomFich + '.REC';
    Assign(RecFile, Nom);
    Reset(RecFile);
     
    Nom := NomFich + '.LST';
    Assign(LstFile, Nom);
    Reset(LstFile);
     
    Assign(BatFile,'STARTUP.F');
    ReWrite(BatFile);
    Write ('Genere : STARTUP.F') ;
     
    IndexSortie := 1;
    FFic := DebPath + FAbs[IndexSortie];
    Write(', ',FFic);
    Assign(FFile, FFic);
    ReWrite(FFile);
     
    (* Op‚rations sur .REC
       Tant que pas derniŠre ligne: lire
       extraire ligne suivante
       premier caractŠre: S1, S9, S0.
       Si S1, c'est du code … prendre en consid‚ration.
          octet suivant = longueur de ligne = 2 + nb d'octets … charger. Garder.
          deux octets suivants = adresse de chargement.
          Faire la diff‚rence avec adresse pr‚c‚dente.
          Est-ce ‚gal au pr‚c‚dent nombre d'octets … charger?
             Si oui, fermer le fichier de sortie, en ouvrir un autre pour
             cette nouvelle adresse.
             et r‚pertorier cette adresse et ce fichier.
             Sinon ajouter cette ligne au fichier de sortie en usage.
          DerniŠre ligne ?
             Non: passer  la ligne suivante.
             Oui: fermer les fichiers  de sortie,
                                       d'entr‚e,
                  ‚crire le fichier .BAT
    *)
    While Not Eof(RecFile) do
    begin
       ReadLn(RecFile,Interrog);
       If Interrog[2] = '1' Then
       begin          (* c'est du code *)
       Long_ := '$' + Copy(Interrog, 3,2);
       Val(Long_, Longr, RapErr);
       Longr := Longr - 3 ;
          Adre_ := '$' + Copy(Interrog,5,4);
          Val(Adre_, NouvAdresse, RapErr);
          If debut Then
          Begin
             WriteLn(BatFile,'c F1.ABS 0x' + Copy(Interrog,5,4));
             Debut := false;
          End
          Else      (* ce n'est pas le d‚but  *)
          Begin
             Decal := NouvAdresse - PrecAdresse;
      (* si Decal = Longueur pr‚c‚dente, alors poursuivre mˆme fichier de sortie *)
             If Decal <> PrecLongr Then
             begin
             (* fermer ancien, ouvrir suivant *)
                Flush(FFile);
                Close(FFile);
                IndexSortie := Succ(IndexSortie);
                FFic := DebPath + Fabs[IndexSortie];
                Write(', ',FFic);
                Assign(FFile, FFic);
                Rewrite(FFile);
             (* mettre … jour fichier BAT *)
                WriteLn(BatFile,'c ',FABS[Indexsortie],' 0x' + Copy(Interrog,5,4));
              end; (* de discordance d'adresse *)
          end; (* of else: pas au d‚but *)
          PrecLongr := Longr  ;
          Longr := Longr + Longr;
          ACopier_ := Copy(Interrog, 9, Longr);
          I := 0 ;
          repeat
            I := I+2 ;
            Longr1 := Ord(Acopier_[I]) - 48;
            If Longr1 > 9 Then Longr1 := Longr1 - 7;
            Longl := Ord(Acopier_[I-1]) - 48;
            If Longl > 9 Then Longl := Longl - 7;
            Longr1 := 16 * Longl + Longr1;
            Write(FFile, Longr1 );
          until I>=Length(ACopier_) ;
          PrecAdresse := NouvAdresse;
    (*      debut := false;*)
       end;  (* of S1 *)
    end;   (* Eof(RecFile) *)
    Flush(FFile);
    Close(FFile);
    Close(RecFile);
     
    (* op‚rations sur .LST: n‚gliger tant que pas SYMBOL TABLE
                            r‚p‚ter aprŠs ces mots et jeter dans fichier
    *)
    Repeat
       ReadLn(LstFile,Interrog);
    Until Pos('SYMBOL',Interrog) <> 0;
     
     
    Compte := 0;
     
    (* extraire symboles de la table *)
    While Not Eof(LstFile) do
       Begin
       Repeat
          ReadLn(LstFile,Interrog);
          Lon := Ord(Interrog[0]);
       Until Lon > 2;  (* on ‚limine les lignes vides *)
          Bl := Pos(' ', Interrog);
          Symb :=  Copy(Interrog,1,Bl-1);
     
          Ch   := Bl;
          Repeat
             Ch := Succ(Ch);
          Until Ord(Interrog[Ch]) > 32;
          Interrog := copy(Interrog, Ch, Lon-Ch+1);
          Lon := Ord(Interrog[0]);
          Bl := Pos(' ', Interrog);
          Adres := Copy(Interrog,1, Bl-1);
          if Symb<>'' then NouvLign := Symb + '=0x' + Adres ;
          Compte := Succ(Compte);
     
          If Compte < 999 (* NbEntry *) Then
          Begin
             Ch   := Bl;
             Repeat
                Ch := Succ(Ch);
             Until Ord(Interrog[Ch]) > 32;
             Interrog := copy(Interrog, Ch, Lon-Ch+1);
             Lon := Ord(Interrog[0]);
             Bl := Pos(' ', Interrog);
             Symb := Copy(Interrog,1, Bl-1);
     
             Ch   := Bl;
             Repeat
                Ch := Succ(Ch);
             Until Ord(Interrog[Ch]) > 32;
             Interrog := copy(Interrog, Ch, Lon-Ch+1);
             Bl := Pos(' ', Interrog);
             If Bl > 0 Then Adres := Copy(Interrog,1, Bl)
                       Else Adres := Interrog;
     
             if Symb<>'' then NouvLign := Nouvlign +';'+ Symb + '=0x' + Adres;
             Compte := Succ(Compte);
          End; (* de ligne … deux entr‚es *)
          WriteLn(BatFile, NouvLign);
       End;  (* of While *)
    (* Eof(LstFile) *)
       WriteLn(BatFile,'<fonc.f');
       Close(BatFile);
       Close(LstFile);
       Writeln ;
    End.

  10. #10
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    @ALWEBER

    Merci pour cette contribution.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

Discussions similaires

  1. A quoi sert XML-Schema
    Par Community Management dans le forum Valider
    Réponses: 20
    Dernier message: 26/01/2009, 10h52
  2. à quoi sert le délestage?
    Par r0d dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 5
    Dernier message: 06/10/2004, 15h34
  3. a quoi sert le schema dans postgres ??
    Par champion dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 13/09/2004, 11h25
  4. [info] A quoi sert ImageObserver ?
    Par FrigoAcide dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 22/03/2004, 18h20

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