logo

Knowledge Is Power

 
 

- Reinit des nouveaux posts -

- Recherche -

Messages Privés - Derniers posts
S'enregistrer - Login - Liste des membres
Vous logger : Login Pass

Programmation - Langages de Programmation >> aidez-moi, svp ! (c++, programme tout con) Newtopic | Reply
1 | 2 | 3 | Page suivante
poster txt
sirius_black
Inscrit le 05-07-2003
Avatar
Posté le 14-05-2007 18:56

Code:
int main(int argc, string argv[])



Je pense que le string pour les arguments ça passera pas. Tu auras forcément du char **
_________________________
d4 n3wS
profil | mail | Website | edit | quote
MeiK
Inscrit le 20-11-2002
Posté le 14-05-2007 19:08

Quote:

On a le droit de faire directement des comparaisons sur des chaines en C++ (je connais mal) ?



Bah si tu utilises le type string (et pas char *) oui, vu que l'operateur == a ete surcharge pour etre utilise avec ce type la.
_________________________

profil | mail | edit | quote
tweakie
Inscrit le 01-02-2002
Posté le 15-05-2007 01:35

Allez, une correction minimaliste (si on peut dire), en essayant de conserver un maximum de l'original (à titre pédagogique, hein). Juste histoire de faire avancer le schmilblick.

Quelques bonnes habitudes à prendre (parmi d'autres):
- séparer la déclarationd des classes (dans le .h) de leur définition (dans le .cpp)
- se conformer à un standard d'écriture qui permet de distinguer nom de classes (commence par une majuscule), variables membres ( terminées par _), nom de variables et de fonctions.
- systématiquement initialiser ses variables (dans le constructeur pour les variables membres)
- ne pas essayer de faire trop de choses à la fois (une initialisation et un test), surtout au début quand on ne maîtrise pas ce que l'on écrit
- préferer les allocations dynamiques quand on ne connait pas la taille qui sera utilisée (ici, il eut fallu utiliser des structures plus appropriées, telles que les std::set ou std::map, mais j'ai fait simple), et libérer la mémoire en conséquence (ouais, je vous vois venir mais en l'occurrence dans le catch on s'en tappe).
- Distinguer les fonctions "const" des autres
- ne pas utiliser "static" à tort et à travers
- toujours tester la validité de ce qu'on utilise (là, il reste du boulot)
- ...j'en oublie moult...

Le .h

Code:

#include <iostream>
#include <string>

using namespace std;

class Analyse {
protected:
int nmots_; /* le nombre de mots */
int nmotsunik_; /* le nombre de mots "unique" */
string* mots_; /* le conteneur de mots */
int* cmots_; /* combien de fois ce mot apparait */

void initialize(int nb_max);

public:

Analyse(int max_nb_mots);
~Analyse();
int search(string tmpmots) const;
int add(string tmpmots);
inline int get_limit() const {return nmots_;}
void print() const;
};




Le .cpp:
Code:

#include "discourama.h"

Analyse::Analyse(int max_nb_mots):nmots_(0), mots_(NULL), cmots_(NULL), nmotsunik_(0){
if(max_nb_mots > 0){
mots_ = new string[max_nb_mots];
cmots_ = new int[max_nb_mots];
for(int it = 0; it < max_nb_mots; it++){
mots_[it] = "";
cmots_[it] = 0;
}
} else {
throw 1;
}
}

Analyse::~Analyse(){
delete[] mots_;
delete[] cmots_;
}

int Analyse::search(string tmpmots) const{
for (int bcl=0; bcl<nmotsunik_ ; bcl++){
if (tmpmots == mots_[bcl])
return bcl;
}
return -1;
}

int Analyse::add(string tmpmots){
int tmp = 0;
nmots_++;
tmp = search(tmpmots);
if (tmp !=-1 ){/* si il existe dans la liste */
cmots_[tmp]++;
return tmp;
} else {/* sinon */
mots_[nmotsunik_]=tmpmots;
nmotsunik_++;
return 0;
}
}

void Analyse::print() const {
for (int bcl=0; bcl<nmotsunik_; bcl++){
cout<<mots_[bcl]<<"("<<cmots_[bcl]+1<<") ";
}
return;
}


int main(int argc, char* argv[]){
string* toto = NULL;
if(argc >1){
toto = new string[argc-1];
} else {
return 1;
}
for (int cpt = 1; cpt < argc; cpt++){
toto[cpt-1] = argv[cpt];
}
try{
Analyse premiere(argc-1);
for (int bcl=0; bcl<argc-1; bcl++){
premiere.add(toto[bcl]);
}
premiere.print();
}
catch(...){
return 1;
}
delete[] toto;
return 0;
}



Edit: p*tain, pourquoi cette balise code insère des sauts de ligne entre chaque ligne ?

_________________________
Un peu de science vaut mieux que beaucoup de dévotion

[ Ce Message a été édité par: tweakie le 2007-05-15 01:38 ]
profil | Website | edit | quote
MeiK
Inscrit le 20-11-2002
Posté le 15-05-2007 08:31

arf t'as pas protege ton header contre une multiple inclusion ! (ouais je fais mon chieur, mais c'est pour donner un conseil supplementaire au monsieur)

Code:
discourama.h:11: error: redefinition of 'class Analyse'
discourama.h:11: error: previous definition of 'class Analyse'



(oui j'ai #include "blabla.h" une seconde fois volontairement)
_________________________

profil | mail | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 15-05-2007 21:59

sincèrement merci tweakie !
_________________________
On ne vois des anges que le dos ...
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
tweakie
Inscrit le 01-02-2002
Posté le 15-05-2007 22:45

> arf t'as pas protege ton header contre une multiple inclusion ! (ouais je fais mon chieur, mais c'est pour donner un conseil supplementaire au monsieur)


Ouais, ben des erreurs, y en a d'autres Alors tant qu'à corriger celle là, allons jusqu'au bout:

- La mauvaise méthode:
#pragma once en début du .h, à priori ne fonctionne que sous Visual C++

- La bonne méthode:
#ifndef DISCOURAMA_H
#define DISCOURAMA_H

en début du .h et

#endif

à la fin.

> sincèrement merci tweakie !

Bon, maintenant tu as un mauvais programme qui marche. Reste à faire un bon programme.

1/ à la place de faire l'hypothèse que chaque argument de la ligne de commande correspond à un mot, définir un jeu de caractères autorisés (typiquement [a-z], [A-Z], [1-9], '-'), et considérer que tout caractère non autorisé sert de séparateur entre deux mots.

2/ Réaliser un itérateur qui suive la syntaxe STL, construit à partir de argc et argv, qui utilise un automate à état finis très simple, et qui itère sur les différents mots (selon la définition donnée en 1/) de la ligne de commande.

3/ Utiliser cet itérateur pour remplir une std::map, la clef de la map étant le mot et la donnée correspondante son nombre d'occurence.

4/ Finalement, itérer sur la map pour afficher les nombres d'occurrences.

T'as déja la moitié du boulot de faite
_________________________
Un peu de science vaut mieux que beaucoup de dévotion
profil | Website | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 15-05-2007 23:36

excuse moi, tu parles à qui tweakie ? Si c'est à moi, j'ai plusieurs questions :
- c'est quoi "la syntaxe STL" ?
- non, en fait je comprends à peu prés le 1/ et puis plus rien !
- il faut vraiment que je lise mon pavé sur le c++ : c'est quoi ça "map" (un conteneur, mais comme il n'existe pas en C. Personne ne l'utilise alors, moi, plus qu'un autre, je l'oublie).
Bon, je vais lire. a+ et merci !
Et une vrai question : "Analyse::Analyse(int max_nb_mots):nmots_(0), mots_(NULL), cmots_(NULL), nmotsunik_(0)", sa sert à quoi les variables aprés le premier ")"

_________________________
On ne vois des anges que le dos ...

[ Ce Message a été édité par: Nothing2Do le 2007-05-15 23:41 ]
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
space-kro
Inscrit le 11-01-2007
Posté le 15-05-2007 23:50

Salut,

STL, c'est la Standart Template Librairy, je crois que ça contient des conteneurs et des itérateurs, ça permet de faire des truc plus propres je crois :
http://www.sgi.com/tech/stl/
Bon sinon j'en connais pas plus alors je laisse Tweakie t'expliquer mieux.

Pour ta "vraie" question, je pense que les variables servent à initialiser les variable d'instances de ta classe à la construction.
profil | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 16-05-2007 00:34

j'ai lancé le programme de tweakie là-dessus : http://www.u-m-p.org/site/index.php/ump/s_informer/discours/une_nouvelle_campagne_electorale_commence
et je dois encore améliorer quelque trucs (les accents, la ponctuation, etc ...). Je vous préviendrais quand sa sera fini. Encore merci !
_________________________
On ne vois des anges que le dos ...
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
tweakie
Inscrit le 01-02-2002
Posté le 16-05-2007 01:19

P*tain de m*erde de backspace qui fait "page back", je viens de perdre un message gigantestque


Je refais en beaucoup plus court.

Quote:

STL, c'est la Standart Template Librairy, je crois que ça contient des conteneurs et des itérateurs, ça permet de faire des truc plus propres je crois :
http://www.sgi.com/tech/stl/
Bon sinon j'en connais pas plus alors je laisse Tweakie t'expliquer mieux.



Voilà, il y a aussi quelques algos, et la classe string, que Nothing2Do a utilisée dans son programme (#include , using namespace std). C'est pour ça que je pensais qu'il connaissait.

Quote:

Pour ta "vraie" question, je pense que les variables servent à initialiser les variable d'instances de ta classe à la construction.



Exact. Ca appelle le constructeur adéquat pour chacune de ces variables. Copy constructor ou autre. L'alternative serait de d'utiliser l'opérateur = entre les accolades, mais on aurait construction + initialisation. Et il faurait que le constructeur par défaut existe.

Revenons sur la STL. Les itérateurs ont une syntaxe commune. Par exemple:

Code:

//on dispose d'un vecteur v contenant des entiers dont on souhaite afficher les valeurs
for(std::vector::iterator it = v.begin(); it != v.end(); ++it){
cout << *it<<" ";
}



A retenir:
- C'est le container qui construit l'iterateur grâce à la fonction begin()
- L'itérateur n'à pas besoin de connaître sa propre condition d'arrêt. Celle-ci est déterminée par comparaison avec un autre itérateur, créé par la fonction end() du container, situé immédiatement après le dernier élément
- *it retourne la valeur pontée par l'itérateur (opérateur à définir).

Dans notre cas, il faudrait donc.
- Créer à partir d'argc et argv un équivalent de notre container. Appellons le CommandLineParameters. Cet objet garde une référence sur argc et argv.
- Créer un itérateur à partir de cet objet. L'itérateur n'a pas besoin de connaître argc.

- Outre le constructeur, CommandLineParameters nécessite deux fonctions: begin() qui crée l'itérateur, avec cur_arg = 0 et end() qui crée un itérateur avec cur_arg = argc.
- L'itérateur peut être implémenté comme une nested class de CommandLineParameters (CommandLineParameters::iterator).
- L'itérateur doit définir deux opérateurs minimum != et *

L'autre option serait de construire un itérateur qui connaîtrait sa condition'arrêt directement à partir de argc et argv.

Pour l'automate, c'est simple. Tu parcours les différents caractères de tes arguments, et tu retiens si tu es entrain de parcouir un mot (le dernier caractère lu est dans le charset) ou si tu es "entre deux mots". Quand tu passes de l'état Mot à l'état Pas_mot, tu retournes le mot courant. Quand tu passes de l'état Pas_mot a l'état Mot, tu retiens la localisation du début du mot, ce qui te permettra de construire la chaine à retourner.
Avec les différents arguments, c'est un poil plus complexe, mais le principe est là.

Pour ce qui est de la "map", tu connais peut être ça sous le nom "table". C'est une structure de donnée qui associe des clefs uniques, de type arbitraire, à des valeurs pas forcément uniques, de valeur arbitraire aussi.

On peut faire des recherches rapides sur la clef (savoir si elle est présente ou pas dans la table, et récupérer la valeur associée quand c'est le cas), d'où l'intérêt. Regarde aussi std::pair, par la même occasion.

_________________________
Un peu de science vaut mieux que beaucoup de dévotion

[ Ce Message a été édité par: tweakie le 2007-05-16 09:22 ]
profil | Website | edit | quote
tweakie
Inscrit le 01-02-2002
Posté le 16-05-2007 09:22

Je crois que j'ai ecrit une connerie:

> L'itérateur n'a pas besoin de connaître argc.


Correction: Apres 2 secondes de reflexion, et etant donne qu'il peut y avoir des arguments qui ne contiennent aucun mot, je pense que si.

Faudra aussi aussi peaufiner la machine a etats (lors d'une iteration, skipper tous les caracteres hors-charset situes apres le mot retourne').
_________________________
Un peu de science vaut mieux que beaucoup de dévotion
profil | Website | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 17-05-2007 22:58

tweakie : pourquoi le "static" n'est-il pas le bienvenue ? la variable est ici pour compter le nombre de mots en tout ! il est 23h20, ke crois que c'est la fatigue ...
_________________________
On ne vois des anges que le dos ...
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 19-05-2007 23:21

tweakie : tu penses pas que sa serait plus simple avec un "list<string, int>" ? Ce qui m'amène à la question (un peu conne mais pas trop) : comment on accède à la deuxième "colonne" (les int) avec la liste pré-cité ?
_________________________
On ne vois des anges que le dos ...
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 20-05-2007 00:30

Bon, pour finir, j'ai fais un programme en C++ (en vrai C++). et du coup, j'ai un autre problème :
Code:

#include <iostream>
#include <list>
#include <string>
using namespace std;
int affiche(list<string, int> & conteneur_)
{
/* je ne sais pas (et en plus je trouve pas comment on affiche TOUTES les valeurs (le string ET son int)) */
}
void add(string word, list<string, int> & conteneur_)
{
list<string, int> tmp=conteneur_.find(word);
if(tmp=conteneur_.end()) /* le "tmp" évite 2 appel de la même fonction */
{
conteneur_.push_back(word)=1;
}
else
{
conteneur_[word]++;
}
}

int main(int argc, string & argv[]
{
list<string, int> conteneur;
for(int bcl=0; bcl<argc; bcl++)
{
add(argv[bcl], conteneur);
}
affiche(conteneur);
}


Sa fait plus court ! (et c'est plus simple d'y réfléchir)

_________________________
On ne vois des anges que le dos ...

[ Ce Message a été édité par: Nothing2Do le 2007-05-20 00:31 ]
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
tweakie
Inscrit le 01-02-2002
Posté le 20-05-2007 04:38

Quote:

tweakie : pourquoi le "static" n'est-il pas le bienvenue ? la variable est ici pour compter le nombre de mots en tout ! il est 23h20, ke crois que c'est la fatigue ...



Les variables statique sont à éviter au maximum. Dans un programme complexe, il est toujours difficile de comprendre comment/quand/pouquo/par qui elles sont modifiées ou utilisées. C'est une source de bug non négligeable. Il y a bien sur des exceptions, qui correspondent à des éléments de design bien particuliers...et doivent rester des exceptions.

Ici, tu n'as aucun besoin d'une variable static (tu comptes avoir plusieurs objets Analyse qui incrémenteront le même compteur en parallèle ? Même pour ça, il y a mieux.) La preuve: je m'en passe très bien dans mon code.

Quote:

tweakie : tu penses pas que sa serait plus simple avec un "list<string, int>" ? Ce qui m'amène à la question (un peu conne mais pas trop) : comment on accède à la deuxième "colonne" (les int) avec la liste pré-cité ?



Rhaaa...as-tu pris le temps de lire la doc de la classe que tu utilises ?

Les paramètres templates de list (là où tu mets <string, int>) sont, d'après Microsoft:

Code:

template <
class Type,
class Allocator=allocator<Type>
>
class list



Parameters

Type
The element data type to be stored in the list.

Allocator
The type that represents the stored allocator object that encapsulates details about the list's allocation and deallocation of memory. This argument is optional, and the default value is allocator<Type>.

As-tu l'impression que le type "int" que tu spécifies à quelque chose à voir, de près ou de loin, avec la description qui est donnée pour Allocator ?

Non ? Normal. Dans un premier temps, on fera l'hypothèse que tu n'as jamais à toucher à ce deuxième paramètre template.

Avec des listes, ce que tu cherches à faire, c'est:

Code:

//using namespace std

list<pair<string, int> >



MAlheureusement, ce n'est pas une liste qu'il te faut, étant donné que:
1/ l'ordre des éléments n'est pas essentiel (tu ne tries pas)
2/ tu ne vas pas souvent insérer de nouveaux éléments au sein de la liste
3/ Tu veux éviter les éléments dupliqués
4/ Pour ça tu dois pouvoir rechercher rapidement si un élément est présent dans la liste ou pas

Donc, au risque de me répéter, ce que tu veux utiliser, c'est une std::map<string, int>, qui contiendra des std::pair<string,int>.

Donc remplace ta liste par une map, débrouilles toi pour construire les paires, éditer et afficher leur contenu (c'est pas compliqué), et ça marchera beaucoup mieux.

A propos, tu connais le blog de Jean Véronis ?
_________________________
Un peu de science vaut mieux que beaucoup de dévotion
profil | Website | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 20-05-2007 09:27

Quote:

1/ l'ordre des éléments n'est pas essentiel (tu ne tries pas)


sa serait plus intéressant avec des mots triés par nombre d'occurences que par ordre d'apparition.
Quote:

Ici, tu n'as aucun besoin d'une variable static (tu comptes avoir plusieurs objets Analyse qui incrémenteront le même compteur en parallèle ? Même pour ça, il y a mieux.) La preuve: je m'en passe très bien dans mon code.


là, il faut que je sache ce qui est mieux ! parce qu'effectivement, sa pourrait être une possibilité (genre, on analyse plusieurs discours et on "stoke" dans des variables différentes pour ne pas faire un gros bordel à la fin)
Non, je ne connais pas... mais j'ai trouvé et je regarde ! Et en fait, on peut pas télécharger la source, donc c'est nul

_________________________
On ne vois des anges que le dos ...

[ Ce Message a été édité par: Nothing2Do le 2007-05-20 09:51 ]
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
tweakie
Inscrit le 01-02-2002
Posté le 20-05-2007 15:20

Quote:

sa serait plus intéressant avec des mots triés par nombre d'occurences que par ordre d'apparition.



Auquel cas il suffira de recopier les données depuis la map vers une autre structure de données (une liste, pourquoi pas) et de redéfinir un opérateur de comparaison entre éléments. Mais amha il vaut mieux commencer par faire le programme de base, puis tu le complèteras au fur et à mesure...

Quote:

là, il faut que je sache ce qui est mieux ! parce qu'effectivement, sa pourrait être une possibilité (genre, on analyse plusieurs discours et on "stoke" dans des variables différentes pour ne pas faire un gros bordel à la fin)



Même si tu veux pouvoir "fusionner" les analyses de plusieurs discours, tu n'as aucun intérêt à utiliser des variables statiques. Mieux vaut dans ce cas ajouter à la classe "Analyse" des méthode permettant de fusionner plusieurs objets de type "Analyse". Donc, je persiste, utiliser des variables statiques n'a aucun intérêt ici.

D'ailleurs, si tu implémentes la "fusion" d'analyses, ça commencera à ressembler (sur le principe, pas pour l'implémentation) à l'indexeur qui est utilisé par le moteur de recherche de ce forum (à celà près qu'on avait prévue une version incrémentale).

Quote:

Non, je ne connais pas... mais j'ai trouvé et je regarde ! Et en fait, on peut pas télécharger la source, donc c'est nul



Ouais, mais pour ce qui est de l'analyse des discours, il propose des outils pas mal.
_________________________
Un peu de science vaut mieux que beaucoup de dévotion
profil | Website | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 20-05-2007 23:12

je préfère correctement dés le début (et je ne vois pas l'interêt de déplacer des variables alors qu'on peut les mettres au "bonne" endroit dés le début) ! Comme une list<> a la fonction membre sort()... Et tu dis que les "static" n'ont que peu d'interêts, pourquoi on les a créer alors ? moi, je vois un language qui m'offre cette possibilité, je vais pas l'esquiver parce qu'on m'a dit que c'était mal !
Illustration :
Quote:
tu n'as aucun intérêt à utiliser des variables statiques


Et, la dernière question, quelle sont tes sources pour me sortir un morceau d'header comme sa ?
_________________________
On ne vois des anges que le dos ...
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
tweakie
Inscrit le 01-02-2002
Posté le 21-05-2007 01:19


>je préfère correctement dés le début


Alors tu me concèdera que là, t'es mal barré...

Quote:

(et je ne vois pas l'interêt de déplacer des variables alors qu'on peut les mettres au "bonne" endroit dés le début) !



Justement. Avant de la trier tu dois le remplir, ton container. Et vue la manière dont tu dois le remplir, on va pas tortiller pendant 3000 ans: c'est une map que tu dois utiliser. Je ne vais pas argumenter éternellement sur un truc qui te paraîtra évident dès que tu auras un minimum de familiarité avec ces structures de données...

Quote:

Comme une list<> a la fonction membre sort()...



Et ben

Code:

for(std::map::iterator it = dico.begin(); it != dico.end(); dico++){
dico_list.push_back(*it);
}



C'est pas la mort quand même ? On te paie pas à économiser des lignes de code ? Et question perfs, c'est incomparablement meilleur que de chercher toi-même, en itérant systématiquement sur tous les éléménts, si la chaîne de caractères que tu veux insérer est déja présente dans la liste.

Quote:

Et tu dis que les "static" n'ont que peu d'interêts, pourquoi on les a créer alors ? moi, je vois un language qui m'offre cette possibilité, je vais pas l'esquiver parce qu'on m'a dit que c'était mal !



Les variables statiques ont un grand intérêt dans quelques situations bien particulières, typiquement associées à des singletons (http://en.wikipedia.org/wiki/Singleton_pattern). Ca n'est manifestement pas le cas ici. That's all. Celà dit, tu n'as toujours pas été foutu de me dire pourquoi tu y tenais tant. C'est certes une position plutôt philosophique, qui tient au fait que la staticité fait un peu entorse à la conception "orientée objet" (dans ton cas, les variables n'appartiennent plus à un objet donné mais à la classe), mais selon moi la bonne méthode consiste à les éviter tant que possible et à y recourir uniquement quand on a épuisé toutes les autres solution pratiques/élégantes envisageables. J'en ai déja brièvement exposé les raisons, mais elles ne semblent pas te convaincre.

Si tu tiens absolument à les utiliser, consulte d'abord ca:
http://www.up.univ-mrs.fr/wcpp/V1/Lecons/L17.pdf

Quote:

Et, la dernière question, quelle sont tes sources pour me sortir un morceau d'header comme sa ?



La librairie MSDN, via l'aide de Visual Studio express. Aussi accessible on-line ici:
http://msdn2.microsoft.com/en-us/library/802d66bt(VS.80).aspx

A y être, jette aussi un coup d'oeuil là:
http://msdn2.microsoft.com/en-us/library/s44w4h2s(VS.80).aspx
_________________________
Un peu de science vaut mieux que beaucoup de dévotion
profil | Website | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 21-05-2007 12:11

je n'aime ni microsoft, ni l'interface de son site. j'ai cherché autre chose et : http://www.cppreference.com/
_________________________
On ne vois des anges que le dos ...
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
Newtopic | Reply 1 | 2 | 3 | Page suivante

Online : JosephLag, MiguIdeomy et 79 Guests


Retour Index NewFFR Repository : http://taz.newffr.com
Cagades à Stick : http://alcane.newffr.com
Forum HTML et Archive -> ici
ForumFR Sql/Xml (2006/04) (SF pas à jour du tout...) - Alive since 2001 Newffr.com
Pour toute plainte ou problème -> Contacter Borax, Hyatus, Tweakie ou Stick par message privé (ou Gueulez sur le forum :) )
Retour haut de page