Partage
  • Partager sur Facebook
  • Partager sur Twitter

URGENT - Problème de transcription Java-Android

Pitié à l'aide, je deviens chauve à force de m'arracher les cheveux

    25 mai 2016 à 21:44:59

    Bonjour ! Je recherche actuellement mon nouveau dieu...
    J'ai récemment créé un programme sur Java et j'ai presque fini de le porter sur Android.
    Android Studio ne trouve aucune erreur dans le code, le XML est nickel, pourtant l'appli continue de crasher sans raison. Sachant que le débuggeur ne trouve rien, y'aurait t'il quelqu'un pour me dire ce qui ne va pas dans ce code?

    • Classe principale :
      public class MainActivity extends AppCompatActivity {
          TableauClass plate = new TableauClass();
          Player J1 = new Player(1,1);
          Bat b1 = new Bat(plate.casePlateau);
          Slime s1 = new Slime(plate.casePlateau);
          TextView etiqPlateau = (TextView) findViewById(R.id.etiqPlateau);
          TextView etiqVie = (TextView) findViewById(R.id.etiqVie);
          TextView etiqScore = (TextView) findViewById(R.id.etiqScore);
      
      
          private void propetiqPlateau() {
              plate.casePlateau[J1.yPlayer][J1.xPlayer] = J1.iconPlayer; // on met l'icone du joueur dans le plateau
              plate.casePlateau[b1.y][b1.x] = b1.icon; // on positionne la bat
              plate.casePlateau[s1.y][s1.x] = s1.icon; // on positionne le slime
              //affichage de l'écran de démarage
              etiqPlateau.setText("<html><font color = #FFFFFF>░░░░░░\\|||/░░░░░░░░░<br>░░░░░░(o░o)░░░░░░░░░┌─┬──────┐<br>,~ooO~~(_)~~~~~~,░░░│</font><font color = #00FF00>☻</font><font color = #FFFFFF>│joueur│<br>|░░░░░HELL'S░░░░|░░░│m│murs░░│<br>|░░░░░REVENGE░░░|░░░│s│sol░░░│<br>|░░░░░░░░░░░░░░░|░░░│</font><font color = #00FFFF>J</font><font color = #FFFFFF>│Slime░│<br>'~~~~~~~~~~~Ooo~'░░░│</font><font color = #FFFF00>B</font><font color = #FFFFFF>│bat░░░│<br>░░░░░|__|__|░░░░░░░░│</font><font color = #FF0000>@</font><font color = #FFFFFF>│sortie│<br>░░░░░░||░||░░░░░░░░░└─┴──────┘<br>░░░░░ooO░Ooo░░░░░░░░<br><br> appuyer sur une touche pour commencer</font><html>");
      
              //Affichage de la vie
              etiqVie.setText(J1.affVie());
              etiqVie.setTextColor(Color.RED);
      
              //Affichage du score
              etiqScore.setTextColor(Color.GREEN);
              etiqScore.setText("<html>SCORE = "+J1.score+"<br>HIGHSCORE = "+J1.highScore+"<html>");
          }
      
      
      
          private void changeNiveau(){ // changement de niveau
              plate.casePlateau[J1.yPlayer][J1.xPlayer] = 's'; // on met un s à la place du joueur
              J1.xPlayer = 1; // on positionne le joueur en 1-1
              J1.yPlayer = 1;
              plate.initTableau(); // on ititialise le plateau
              plate.casePlateau[J1.yPlayer][J1.xPlayer] = J1.iconPlayer; //on affiche je joueur
              b1.vie=8; // on remet les monstre au max
              b1.posMonstre(plate.casePlateau);
              s1.vie=4;
              s1.posMonstre(plate.casePlateau);
              plate.casePlateau[b1.y][b1.x] = b1.icon; // affichage des monstres
              plate.casePlateau[s1.y][s1.x] = s1.icon;
              etiqPlateau.setText(plate.affplate());
              J1.vie = J1.vie +3;
              etiqVie.setText(J1.affVie());
          }
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
          }
      
          public void buttonClickRight(View view) { //Quand on clique sur DROIT
              if (J1.vie >0) { //Si la vie est >0
                  plate.casePlateau[plate.h - 2][plate.l - 2] = 's';
                  plate.casePlateau[J1.yPlayer][J1.xPlayer] = 's';
                  if(plate.casePlateau[J1.yPlayer][J1.xPlayer+1] == 's'){
                      J1.xPlayer =J1.xPlayer+1;
                      J1.score ++;
                  }
              }else{ //si la vie est inférieure ou égale à 0
                  etiqPlateau.setText("<html><font color = #FFFFFF>▄██▀▀▀█▄░▄██▀▀▀██▄░▄██▀█▄█▀██▄░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░█░░░██░██░░░<br>██░░░▄▄▄░██▄▄▄▄▄██░██░░░▀░░░██░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░░░░░██░██░░░<br>▀██▄▄▄█▀░██░░░░░██░██░░░░░░░██░██▄▄▄<br>░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░<br>▄██▀▀▀██▄░▀██▄░░██▀░██▀▀▀░██▀▀▀▀██▄░<br>██░░░░░██░░░██░░██░░██░░░░██░░░░░██░<br>██░░░░░██░░░██░░██░░██▀▀▀░██▄▄▄▄▄▀▀░<br>██░░░░░██░░░██░░█▀░░██░░░░██░░░░░██░<br>▀██▄▄▄██▀░░░░▀█▀░░░░██▄▄▄░██░░░░░██▄<br><br>░░appuyer░sur░\"R\"░pour░recommencer░░</font><html>"); // -> GAME OVER
              }
          }
      
          public void buttonClickLeft(View view) { //Quand on clique sur GAUCHE
              if (J1.vie >0) { //Si la vie est >0
                  plate.casePlateau[plate.h - 2][plate.l - 2] = 's';
                  plate.casePlateau[J1.yPlayer][J1.xPlayer] = 's';
                  if(plate.casePlateau[J1.yPlayer][J1.xPlayer-1] == 's'){
                      J1.xPlayer =J1.xPlayer-1;
                      J1.score ++;
                  }
              }else{ //si la vie est inférieure ou égale à 0
                  etiqPlateau.setText("<html><font color = #FFFFFF>▄██▀▀▀█▄░▄██▀▀▀██▄░▄██▀█▄█▀██▄░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░█░░░██░██░░░<br>██░░░▄▄▄░██▄▄▄▄▄██░██░░░▀░░░██░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░░░░░██░██░░░<br>▀██▄▄▄█▀░██░░░░░██░██░░░░░░░██░██▄▄▄<br>░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░<br>▄██▀▀▀██▄░▀██▄░░██▀░██▀▀▀░██▀▀▀▀██▄░<br>██░░░░░██░░░██░░██░░██░░░░██░░░░░██░<br>██░░░░░██░░░██░░██░░██▀▀▀░██▄▄▄▄▄▀▀░<br>██░░░░░██░░░██░░█▀░░██░░░░██░░░░░██░<br>▀██▄▄▄██▀░░░░▀█▀░░░░██▄▄▄░██░░░░░██▄<br><br>░░appuyer░sur░\"R\"░pour░recommencer░░</font><html>"); // -> GAME OVER
              }
          }
      
          public void buttonClickUp(View view) { //Quand on clique sur HAUT
              if (J1.vie >0) { //Si la vie est >0
                  plate.casePlateau[plate.h - 2][plate.l - 2] = 's';
                  plate.casePlateau[J1.yPlayer][J1.xPlayer] = 's'; // on place un s à la place du joueur
                  if(plate.casePlateau[J1.yPlayer-1][J1.xPlayer] == 's'){ // on vérifie si on a un s au dessus
                      J1.yPlayer =J1.yPlayer-1; // si oui, on valide de déplacement
                      J1.score ++; // on gagne un point
                  }
              }else{ //si la vie est inférieure ou égale à 0
                  etiqPlateau.setText("<html><font color = #FFFFFF>▄██▀▀▀█▄░▄██▀▀▀██▄░▄██▀█▄█▀██▄░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░█░░░██░██░░░<br>██░░░▄▄▄░██▄▄▄▄▄██░██░░░▀░░░██░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░░░░░██░██░░░<br>▀██▄▄▄█▀░██░░░░░██░██░░░░░░░██░██▄▄▄<br>░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░<br>▄██▀▀▀██▄░▀██▄░░██▀░██▀▀▀░██▀▀▀▀██▄░<br>██░░░░░██░░░██░░██░░██░░░░██░░░░░██░<br>██░░░░░██░░░██░░██░░██▀▀▀░██▄▄▄▄▄▀▀░<br>██░░░░░██░░░██░░█▀░░██░░░░██░░░░░██░<br>▀██▄▄▄██▀░░░░▀█▀░░░░██▄▄▄░██░░░░░██▄<br><br>░░appuyer░sur░\"R\"░pour░recommencer░░</font><html>"); // -> GAME OVER
              }
          }
      
          public void buttonClickDown(View view) { //Quand on clique sur BAS
              if (J1.vie >0) {
                  plate.casePlateau[plate.h - 2][plate.l - 2] = 's';
                  plate.casePlateau[J1.yPlayer][J1.xPlayer] = 's';
                  if(plate.casePlateau[J1.yPlayer+1][J1.xPlayer] == 's') {
                      J1.yPlayer =J1.yPlayer+1;
                      J1.score ++;
                  }
              }else{ //si la vie est inférieure ou égale à 0
                  etiqPlateau.setText("<html><font color = #FFFFFF>▄██▀▀▀█▄░▄██▀▀▀██▄░▄██▀█▄█▀██▄░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░█░░░██░██░░░<br>██░░░▄▄▄░██▄▄▄▄▄██░██░░░▀░░░██░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░░░░░██░██░░░<br>▀██▄▄▄█▀░██░░░░░██░██░░░░░░░██░██▄▄▄<br>░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░<br>▄██▀▀▀██▄░▀██▄░░██▀░██▀▀▀░██▀▀▀▀██▄░<br>██░░░░░██░░░██░░██░░██░░░░██░░░░░██░<br>██░░░░░██░░░██░░██░░██▀▀▀░██▄▄▄▄▄▀▀░<br>██░░░░░██░░░██░░█▀░░██░░░░██░░░░░██░<br>▀██▄▄▄██▀░░░░▀█▀░░░░██▄▄▄░██░░░░░██▄<br><br>░░appuyer░sur░\"R\"░pour░recommencer░░</font><html>"); // -> GAME OVER
              }
          }
      
          public void buttonRestart(View view) { //Quand on clique sur redémarrer
              changeNiveau();
              etiqPlateau.setText(plate.affplate());
              if (J1.score > J1.highScore){
                  J1.highScore = J1.score;
              }
              J1.score = 0;
              J1.vie = 20;
              etiqVie.setText(J1.affVie()); // affichage de la vie
              etiqScore.setText("<html>SCORE = "+J1.score+"<br>HIGHSCORE = "+J1.highScore+"<html>");
      
          }
      }
      
    • Classe qui gère les entités : 
      public abstract class Entity {
          Random rand = new Random();
          public char icon; // charatère représentant l'objet à l'écran
          public int vie; // point de vie
          public int x; // posistion initiale en X
          public int y; // position initiale en Y
          public int att; // points d'attaque
          public int point; // score que rapporte le monstre
      
          public Entity(char[][] plate, int c, char d,int e, int f){ // constructeur de l'objet
      		/*
      		do{ // boucle
      		x = rand.nextInt(plate[0].length-1)+1; // X généré aléatoiremet en fonction de la longuer du plateau
      		y = rand.nextInt(plate.length-1)+1; // Y généré aléatoiremet en fonction de la hauteur du plateau
      		}while (plate[y][x]!='s'); // tant que ce n'est pas une case Sol ('s')
      		*/
              posMonstre(plate);
              vie = c; // attribution de la vie
              icon = d ; // attribution de l'icone
              att = e; //attribution de l'attaque
              point = f; // attribution du score
          }
          public void posMonstre(char[][] plate){
              do{ // boucle
                  x = rand.nextInt(plate[0].length-1)+1; // X généré aléatoiremet en fonction de la longuer du plateau
                  y = rand.nextInt(plate.length-1)+1; // Y généré aléatoiremet en fonction de la hauteur du plateau
              }while (plate[y][x]!='s'); // tant que ce n'est pas une case Sol ('s')
          }
      
          public void move (Player j, char[][] p){ // algorithme de déplacement du monstre
              int yp = j.yPlayer; // position  Y du joueur
              int xp = j.xPlayer; // position  X du joueur
              int vp = j.vie;  // vie du joueur
              int attp = j.att; // attaque du joueur
              int v;
              int h;
              int va;
              int ha;
              if (vie<=0){ //si je monstre est mort, on le positionne en 0-0 et on sort de la boucle
                  x=0;
                  y=0;
                  return;}
              p[y][x]='s'; // on place une case sol à l'emplacement du monstre avant de le déplacer
              v = yp - y; // on regarde de quel coté est le joueur en Y
              h = xp - x; // on regarde de quel coté est le joueur en X
              va = v;
              ha = h;
              if (v < 0){va=-v;} // valeur absolue en Y -> distance verticale
              if (h < 0){ha=-h;} // valeur absolue en X -> distance horizontale
              if (va>=ha){ // si la distance verticale est plus grande que l'hoizontale, on se déplace en Y
                  if (v>0 && p[y+1][x]=='s'){ // si c'est une case sol en bas, le déplacement est validé
                      y = y + 1;
                  }else if (v<0 && p[y-1][x]=='s'){ // si c'est une case sol en haut, le déplacement est validé
                      y = y - 1;
                  }
              }else{ // sinon déplacement en X
                  if (h>0 && p[y][x+1]=='s'){// si c'est une case sol à droite, le déplacement est validé
                      x = x + 1;
                  }else if (h<0 && p[y][x-1]=='s'){// si c'est une case sol à gauche, le déplacement est validé
                      x = x - 1;
                  }
              }
              p[y][x]=icon; // on place l'icone du monstre dans sa nouvelle position
              if (ha+va==1){ // si on est à une case du joueur -> combat
                  vie = vie - attp; // le monstre perd les points de vie équivalents à l'attaque du joueur
                  j.vie = vp - att;// le joueur perd les points de vie équivalents à l'attaque du monstre
                  if (vie <= 0){ // si la vie du monstre tombe à 0
                      p[y][x]='s'; // on efface le monstre du plateau
                      j.score = j.score + point; // le joueur a son score qui augmente
                  }
              }
          }
      
      }
    • Le code qui crée le tableau : 
      public class TableauClass {
          Random rand = new Random(); // rand sert à générer des nombres aléatoires
          int h ; // hauteur du plateau de jeu
          int l ; // largeur du plateau de jeu
          char casePlateau [][]; // tableau à double entrée d'entiers représentant le  plateau
      
          public void initTableau(){ // remplissage du tableau avec murs et sols
      
              h = rand.nextInt(10-4+1)+4; //hauteur aléatoire entre 4 et 14
              l = rand.nextInt(10-4+1)+4; // largeur aleéatoire entre 4 et 27
              casePlateau  = new char [h][l]; // création du tableau de char de hauteur h et de largeur l
              for (int i = 0; i < h; i++){ // on commence par remplir tout le tableau avec du sol ('s')
                  for (int j = 0; j < l; j++){
                      casePlateau [i][j] = 's';
                  }
              }
              for (int i = 0; i < h; i++){ // on met des murs à droite et à gauche
                  casePlateau [i][0] = 'm';
                  casePlateau [i][l-1] = 'm';
      
              }
              for (int i = 0; i < l; i++){// on met des murs en haut et en bas
                  casePlateau [0][i] = 'm';
                  casePlateau [h-1][i] = 'm';
              }
              casePlateau [h-2][l-2] = '@';
          }
      
          public TableauClass(){ // constructeur du plateau
      
              //casePlateau  = new char [h][l]; // création du tableau de char de hauteur h et de largeur l
              initTableau(); // remplissage du plateau
      
          }
          public String affplate(){ // methode d'affichage du tableau
              String plateau; // chaine de caractère affichant le plateau
              String lh = "<html><font color = #FFFFFF>╔"; // affectation de la couleur et premier caractère  de la ligne du haut
              String lm = "";  // ligne du milieu
              String li = "╠"; // interligne
              String lb = "╚"; //ligne du bas
              for (int i = 0; i < l-1; i++){
                  lh = lh + "═══╦"; // on rajoute une case à la ligne du haut autant de fois que la longueur-1 du plateau
                  li = li + "═══╬"; // on rajoute une case à la ligne du milieu autant de fois que la longueur-1 du plateau
                  lb = lb + "═══╩"; // on rajoute une case à la ligne du bas autant de fois que la longueur-1 du plateau
              }
              lh = lh + "═══╗<br>"; // dernière case de la ligne du haut
              li = li + "═══╣<br>"; // dernière case de la ligne du milieu
              lb = lb + "═══╝</font><html>"; // dernière case de la ligne du bas et fin de la couleur
              plateau = lh; // on commence par remplir le plateau avec la ligne du haut
      
              for (int i = 0; i<=h-1; i++){ // pour chaque colonne
                  lm = "║ "; // la ligne du milieu commence avec un ║
                  for (int j = 0; j < l; j++){ // pour chaque élément de la collone
      
                      lm = lm + couleurChar(casePlateau[i][j]) +" ║ "; // on ajoute le caractère de la case concennée entre 2 despaces puis un ║
                      // pour cela on utilise la fonction couleurChar qui gère le changement de couleur en fonction de la case
                  }
                  lm = lm + "<br>"; // on rajoute un retour à la ligne
      
                  if (i != h-1){ // on rajoute la ligne obtenue au plateau et une ligne intermédiaire sauf pour la dernière ligne
                      plateau = plateau+lm+li;
                  }
      
              }
              plateau = plateau+lm+lb; // on rajoute la dernière ligne
              return plateau; // on retourne la chaine de caractère définissant le plateau
          }
      
          private String couleurChar(char a){ // fonction qui affecte une couleur de caractère en fonction de la sase
              String couleur;
              switch (a)
              {
                  case '☻': // case joueur de couleur verte
                      return "</font><font color = #00FF00>" + a +"</font><font color = #FFFFFF>";
                  case 'B': // case Bat de couleur jaune
                      return "</font><font color = #FFFF00>" + a +"</font><font color = #FFFFFF>";
                  case 'J': // case Slime de couleur cyan
                      return "</font><font color = #00FFFF>" + a +"</font><font color = #FFFFFF>";
                  case '@': // case sortie de couleur rouge
                      return "</font><font color = #FF0000>" + a +"</font><font color = #FFFFFF>";
                  default: // sinon couleur courante
                      couleur = ""+a;
              }
              return couleur; //renvoie la chaine obtenue
          }
      }
      
    •  activity_main.xml (des fois que ce serait là dedans) : 

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:paddingBottom="@dimen/activity_vertical_margin"
          android:paddingLeft="@dimen/activity_horizontal_margin"
          android:paddingRight="@dimen/activity_horizontal_margin"
          android:paddingTop="@dimen/activity_vertical_margin"
          tools:context=".projet_isn.MainActivity"
          android:background="@color/darkGray">
      
          <TextView
              android:id="@+id/etiqScore"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="SCORE"
              android:layout_alignParentTop="true"
              android:layout_alignParentLeft="true"
              android:layout_alignParentStart="true"
              android:layout_alignRight="@+id/etiqPlateau"
              android:layout_alignEnd="@+id/etiqPlateau" />
      
          <TextView
              android:id="@+id/etiqPlateau"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="EtiqPlateau Pos"
              android:layout_alignParentLeft="true"
              android:layout_alignParentStart="true"
              android:layout_above="@+id/button4"
              android:layout_alignParentRight="true"
              android:layout_alignParentEnd="true"
              android:layout_below="@+id/Restart" />
      
          <TextView
              android:id="@+id/etiqVie"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="EtiqVie pos"
              android:layout_alignParentLeft="true"
              android:layout_alignParentStart="true"
              android:layout_toLeftOf="@+id/button4"
              android:layout_toStartOf="@+id/button4"
              android:layout_above="@+id/button2"
              android:layout_below="@+id/etiqPlateau" />
      
          <Button
              android:id="@+id/Restart"
              android:text="[R]"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignTop="@+id/etiqScore"
              android:layout_alignParentRight="true"
              android:layout_alignParentEnd="true"
              android:onClick="buttonRestart"/>
      
          <Button
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Right"
              android:id="@+id/button"
              android:layout_alignParentBottom="true"
              android:layout_toRightOf="@+id/button3"
              android:layout_toEndOf="@+id/button3"
              android:onClick="buttonClickRight"/>
      
          <Button
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Left"
              android:id="@+id/button2"
              android:layout_alignParentBottom="true"
              android:layout_toLeftOf="@+id/button3"
              android:layout_toStartOf="@+id/button3"
              android:onClick="buttonClickLeft"/>
      
          <Button
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Down"
              android:id="@+id/button3"
              android:layout_alignParentBottom="true"
              android:layout_alignLeft="@+id/button4"
              android:layout_alignStart="@+id/button4"
              android:onClick="buttonClickDown"/>
      
          <Button
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Up"
              android:id="@+id/button4"
              android:layout_above="@+id/button"
              android:layout_centerHorizontal="true"
              android:onClick="buttonClickUp"/>
      
      
      </RelativeLayout>
    Quiconque réussira à trouver mon erreur entrera dans le panthéon des meilleurs développeurs d'OpenClassrooms et gagnera ma reconnaissance éternelle (Car je n'ai pas d'argent...)
    • Partager sur Facebook
    • Partager sur Twitter
    A wizard is never late, nor is he early. He arrives precisely when he means to.
      25 mai 2016 à 21:57:19

      Pour ceux que ça intéresserait : Voià le message d'erreur (Ici mon téléphone est un NEXUS 5X sous Android 6.0.0: 

      java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{isn.rpg/isn.rpg.projet_isn.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
      
      
      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
      

      Et là un NEXUS 5 sous Android 4.4.4

      java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{isn.rpg/isn.rpg.projet_isn.MainActivity}: java.lang.NullPointerException
      
      Caused by: java.lang.NullPointerException

      Selon le logcat la ligne qui produit l'erreur c'est

          TextView etiqPlateau = (TextView) findViewById(R.id.etiqPlateau);


       

      -
      Edité par Энигмa 25 mai 2016 à 22:16:35

      • Partager sur Facebook
      • Partager sur Twitter
      A wizard is never late, nor is he early. He arrives precisely when he means to.

      URGENT - Problème de transcription Java-Android

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown