L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Voilà que j'ai de nouveau une erreur lors de l'execution dans ma classe List, la console affiche ceci :
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at world.WorldList.<init>(WorldList.java:61)
La ligne correspondante est :L'erreur apparait une bonne minute après le lancement du programme.. C'est assez long quand meme non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part countries.add(country);
J'ai regardé un peu sur internet, il est dit que ce serait du soit à une trop grande utilisation de la mémoire, ou que le tableau est trop petit..
Mais je ne pense pas que ce soit l'une de ses deux raisons puisque j'utilise une Arraylist, qui est tableau dynamique donc pas trop petit, et pour l'utilisation de la mémoire, y a quoi 250 pays à peu près, ce n'est pas énorme non ?
Non, ce n'est pas parce que le "tableau est trop petit" (ça n'a rien à voir). L'erreur dit que qu'il n'y a pas assez de mémoire pour faire le traitement. Mais le problème se situe probablement ailleurs, surtout s'il n'y a que 250 pays et ça dure 1 minute en plus avant que tu aies le message. Je dirais que tu as plutôt une boucle infinie qui ajoute sans arrêt des éléments dans la liste jusqu'à ce que la mémoire ne soit plus suffisante. Sans code je ne peux pas en dire plus.
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Voici la partie du code
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 try { File f1 = new File(fichier1); File f2 = new File(fichier2); File f3 = new File(fichier3); br1 = new BufferedReader (new FileReader(f1)); br2 = new BufferedReader (new FileReader(f2)); br3 = new BufferedReader (new FileReader(f3)); String line1 = null; String line2 = null; String line3 = null; while ((((line1 = br1.readLine())!= null)) && ((line2 = br2.readLine())!=null) && ((line3 = br3.readLine())!=null)){ String[] champLine1 = line1.split(","); // je lis les champs dans le fichier 1 (séparés par des virgules) String[] champLine2 = line2.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); String[] champLine3 = line3.split("\t"); // je lis les champs dans le fichier 3 (séparés par des tab) while (champLine2[0] != null ){ Country country = new Country(countryName,population,surface); countryName = champLine1[0]; // le pays est en première position if (line2.contains(countryName)){ population = champLine2[1]; } if (line3.contains(countryName)){ surface = champLine3[2]; } countries.add(country); } } } catch (Exception e){ e.printStackTrace(); } finally { try { br1.close(); } catch (IOException e1) { e1.printStackTrace(); } try { br2.close(); } catch (IOException e) { e.printStackTrace(); } try { br3.close(); } catch (IOException e) { e.printStackTrace(); } } }
while (champLine2[0] != null ){ champLine2[0] ne change jamais dans le while, donc cette boucle est infine. Donc tu ajoutes indéfiniment des pays dans la liste, donc tu exploses la mémoire.
Mais à quoi sert ce while ? Si le but est de ne pas ajouter un pays si champLine2[0] est null, il suffit de faire un if.
Par ailleurs, ce qu'il y a dans ton while n'est pas logique :
Tu affectes tes variables après les avoir utilisées pour créer le pays : le pays sera donc créé avec les valeurs de la ligne précédente, sauf pour le premier qui sera créé avec les valeurs initiales, soit null, probablement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Country country = new Country(countryName,population,surface); countryName = champLine1[0]; // le pays est en première position if (line2.contains(countryName)){ population = champLine2[1]; } if (line3.contains(countryName)){ surface = champLine3[2]; } countries.add(country);
Il faut affecter les variables à passer au constructeur de Country avant d'appeler le constructeur :
Voire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 countryName = champLine1[0]; // le pays est en première position if (line2.contains(countryName)){ population = champLine2[1]; } if (line3.contains(countryName)){ surface = champLine3[2]; } Country country = new Country(countryName,population,surface); countries.add(country);
Pourquoi d'ailleurs utiliser des variables déclarées ailleurs ? Déclarer ses variables au plus proche de l'endroit où elles servent évite bien des déboires :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 countryName = champLine1[0]; // le pays est en première position if (line2.contains(countryName)){ population = champLine2[1]; } if (line3.contains(countryName)){ surface = champLine3[2]; } countries.add( new Country(countryName,population,surface) );
Là, tu vas avoir une erreur de compilation, parce que population et surface n'existent pas lorsqu'on fait countries.add( new Country(countryName,population,surface) ); ! Ceci devrait t'interpeler sur les valeurs de population et surface pour les pays tels que les conditions line2.contains(countryName) et/ou line3.contains(countryName) ne sont pas vraies (ce qui est plus difficile de voir avec ta déclaration externe des variables).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 String countryName = champLine1[0]; // le pays est en première position if (line2.contains(countryName)){ String population = champLine2[1]; } if (line3.contains(countryName)){ String surface = champLine3[2]; } countries.add( new Country(countryName,population,surface) );
Ainsi :
Bon, après, je ne suis pas sûr que le contains soit le meilleur moyen de tester si une ligne contient le pays. Disons que ça peut marcher, ou pas, en fonction de tes données et de leur qualité... Comme tu disais que tes fichiers n'étaient pas triés de la même manière, je pense que tu devrais plutôt opter pour une lecture séparée, des maps, et une fusion à la fin.
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 String countryName = champLine1[0]; // le pays est en première position String population; if (line2.contains(countryName)){ population = champLine2[1]; } else { population = null; // ou une autre valeur par défaut... } String surface; if (line3.contains(countryName)){ surface = champLine3[2]; } else { surface = null; // ou une autre valeur par défaut... } countries.add( new Country(countryName,population,surface) );
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Le probleme c'est qu'en faisaitca me remet l'erreur d'avant soit : java.lang.ArrayIndexOutOfBoundsException: 0
Code : Sélectionner tout - Visualiser dans une fenêtre à part if (champLine2[0] != null){..}
Oui j'ai pensé à faire une HashMap qui permettrait de réunir les informations des fichiers, mais j'avais une erreur sur ma classe et je voulais pas m'attarder dessus, puisque je n'avais plus beaucoup de temps pour le rendu..Bon, après, je ne suis pas sûr que le contains soit le meilleur moyen de tester si une ligne contient le pays. Disons que ça peut marcher, ou pas, en fonction de tes données et de leur qualité... Comme tu disais que tes fichiers n'étaient pas triés de la même manière, je pense que tu devrais plutôt opter pour une lecture séparée, des maps, et une fusion à la fin.
Il est impossible d'avoir cette exception avec le if si tu ne l'a pas avec le while. La seule différence qu'il y a entre le if à la place du while, c'est que ça exécute le bloc du while qu'une seule fois. Le problème de l'ArrayIndexOutOfBoundsException est ailleurs.
Bah t'attarder à corriger une erreur dans un code simple à mettre au point et un autre beaucoup plus difficile à mettre au point n'est pas vraiment une perte de temps, au contraire.
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Le problème est que l'erreur d'outofmemory se passe alors que tu ne lis que la première ligne de chaque fichier. Alors que l'erreur d'ArrayIndexOutOfBound se passe sur une autre ligne. Mais le while ne corrige pas l'erreur qui se passe avec le if, elle fait simplement qu'il y a une autre erreur qui se passe avant.
Je te donne un moyen de lire tes fichiers avec une seule méthode, séparément :
Bien sûr, il faudra ajuste parce que je ne connais pas le format de tes fichiers (j'ai déduit ce que je pouvais de ton code).
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 /** * * @param file nom de fichier * @param lineToSkip nombre de ligne à ignorer au début du fichier * @param splitString expression régulière pour découpage de lignes en tableau * @param dataIndex numéro de la cellule dans le tableau * @param name nom de la propriété à lire * @param countryIndex numéro de la cellule qui contient le nom du pays, ou -1 si on lit les noms de pays * @param map une map pour stocker le résultat * @throws IOException */ public static void collect(String file, int lineToSkip, String splitString, int dataIndex, String name, int countryIndex, Map<String, Map<String,String>> map) throws IOException { try(BufferedReader reader=Files.newBufferedReader(Paths.get(file))) { for(String line = reader.readLine(); line!=null; line=reader.readLine()) { if ( lineToSkip>0 ) { // on saute les lignes au début lineToSkip--; continue; } final String[] data = line.split(splitString); String value = data[dataIndex]; if( countryIndex==-1 ) { final Map<String,String> dataMap=new HashMap<>(); dataMap.put(name, value); map.put(value, dataMap); } else { final Map<String,String> dataMap=map.get(data[countryIndex]); if ( dataMap!=null ) { dataMap.put(name, value); } } } } } public static List<Counrtry> readCountries() throws IOException { final Map<String, Map<String,String>> map = new HashMap<>(); collect("fichier1", 0, ",", 1, "name", -1, map); // nom du pays collect("fichier2", 6/*on ignore les 6 première lignes*/, ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", 1/*population du pays dans colonne 2*/, "population", 0/* nom du pays dans colonne 1*/, map); // population collect("fichier3", 0, "\t", 2/*surface du pays dans colonne 3*/, "surface", 1/* nom du pays dans colonne 2*/, map); // surface return map.values().stream().map(m->new Country(m.get("name"),m.get("population"),m.get("surface"))).collect(Collectors.toList()); }
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
On a donc une Arraylist d'HashMap ?
J'ai fais les modifications nécessaires au programme, mais je me questionne sur un truc j'avais ceci de base"countries" était le nom de mon tableau en gros, mais dans ta méthode je ne vois pas par quoi je dois le "remplacer". Je m'explique plus bas dans ma classe j'ai des fonctions de recherche par critère et du coup je me sers de "countries" mais là il n'existe plus.. Je dois faire comment ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part ArrayList<Country> countries = new ArrayList<Country>();
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 public Country searchByCountryName(String countryName) throws NoSuchElementException { Country result = null; for (Country country: countries) { if (country.getCountryName().equals(countryName)) { result = country; } } if (result == null) { throw new NoSuchElementException("Country " + countryName + " does not exists."); } else { return result; } }
Nulle part il n'y a d'ArrayList de HashMap...
Bah, countries = readCountries();, dans le constructeur de ta classe, tout simplement. Déclare ta variable countries comme ça : List<Country> countries;. Il vaut mieux en général typer ses variables avec l'interface de plus haut niveau, qu'avec la classe concrète : quand on manipule une liste, à part cas très particulier, on s'en fout que ça soit une ArrayList, une LinkedList ou autre, ce qui importe c'est que ça soit une List, voire même une Collection, voire même un Iterable dans la plupart des cas.
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Le programme n'accepte pas leList<Country> countries;.dans le constructeur il demande de le supprimer, ce qui est bizarre non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part <Country>
Tu as dû importer la classe java.awt.List, alors que c'est java.util.List que tu dois importer.
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
C'était bien ca, merci
Le fait d'entrer les noms des fichiers dans les "collect" suffit ?Car la méthode collect (qui permet de lire les fichiers) est avant celle de la List où est défini les fichiers
Code : Sélectionner tout - Visualiser dans une fenêtre à part collect("rawdata_2147.txt", 0, "\t", 2/*surface du pays dans colonne 3*/, "surface", 1/* nom du pays dans colonne 2*/, map); // surface
La méthode collect lit une seule propriété (on pourrait la faire évoluer pour pouvoir lire plusieurs propriétés) dans chaque ligne d'un fichier. Elle stocke dans une map par pays cette propriété (clef=nom de propriété, valeur=valeur de propriété). L'ensemble de ces maps est stockée dans une map dont la clef est le nom de pays, et la valeur est la map qui contient les propriétés de ce pays. On différencie l'exécution qui va créer les maps d'informations de pays par le paramètre countryIndex : s'il vaut -1, on lit le nom du pays, et on créé une nouvelle map pour le pays lu, et on la stocke dans la map globale qui stocke toutes les maps de chaque pays. S'il ne vaut pas -1, alors il s'agit de la position du nom de pays dans la ligne, et on utilise cette valeur pour retrouver la map d'informations du pays créée par l'appel où countryIndex vallait -1. Il est indispensable d'appeler en premier collect avec ce paramètre à -1 évidemment.
La dernière ligne, return map.values().stream().map(m->new Country(m.get("name"),m.get("population"),m.get("surface"))).collect(Collectors.toList()); ne fait que transformer la map globale (remplie par les différents appels de collect()) en liste d'instances de Country. Il n'y a aucune notion de fichier dans cette ligne.
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Oui oui j'avais bien compris cela, ma question portait sur la méthode précédente, elle lit des fichiers dont elle n'a pas la source, puisque celle ci est déclarée dans la méthode d'après :du coup ca me met tout un tas d'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part collect("rawdata_2147.txt", 0, "\t", 2/*surface du pays dans colonne 3*/, "surface", 1/* nom du pays dans colonne 2*/, map); // surface
Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
Quelle méthode d'après ? D'après quoi ? Des fichiers dont elle n'a pas la source, qu'est ce que ça veut dire, c'est quoi la source d'un fichier ?
Il n'y a qu'une erreur, et c'est juste un problème de charset (tes fichiers ne sont pas UTF-8).
Remplace juste try(BufferedReader reader=Files.newBufferedReader(Paths.get(file))) { par try(BufferedReader reader=Files.newBufferedReader(Paths.get(file),Charset.defaultCharset())) {
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Le nom du fichier en gros
en ajoutant le Charset, une nouvelle erreur apparait :
Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at world.WorldList.collect(WorldList.java:32)
at world.WorldList.countries(WorldList.java:59)
at world.WorldList.searchByCountryName(WorldList.java:72)
at world.WorldTest.testOperations(WorldTest.java:35)
at world.WorldTest.testWorldArrayList(WorldTest.java:23)
at world.WorldTest.main(WorldTest.java:15)
Bah, c'est exactement la même erreur.. tu l'as bien ajouté le charset comme je t'ai indiqué ? Tu n'avais pas cette erreur avec tes FileReader ? Parce que ça utilise exactement le même charset qu'avec FileReader (Charset.defaultCharset()) !
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager