Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pointeur comme supprimer un pointeur à 2D ?

Sujet résolu
    8 février 2006 à 12:15:05

    Bonjour !
    J'ai fait un démineur, mais quand je veux faire le module pour changer la taille de la grille, j'obtiens des erreurs de segmentation en série.

    Pouvez vous me dire comment supprimer mon tableau int 2D **grille ?
    Je vous poste le code si besoin ;)
    • Partager sur Facebook
    • Partager sur Twitter
      8 février 2006 à 12:19:30

      Deja je te conseil de faire un char **tab au lieu d'un int, sinon tu as interet a faire attention a ce que tu écrit...

      Ensuite déclars 2 variable, x et y // Y : vertical, X: horizontal

      tu peux ensuite naviger dans ton tableau sans probleme de cette facon :

      tab[y][x]
      • Partager sur Facebook
      • Partager sur Twitter
        8 février 2006 à 12:33:23

        Ca dépend comment tu l'as créé en fait ; mais je devine un truc du genre :
        int **a;
        /* snip */
        size_t x;
        a = malloc(sizeof *a * xmax);
        if (a == NULL)
                /* erreur */
        for (x = 0; x < xmax; ++x) {
                a[x] = malloc(sizeof *a[x] * ymax);
                if (a[x] == NULL)
                        /* erreur */
        }
        /* snip */
        size_t x;
        for (x = 0; x < xmax; ++x)
                free(a[x]);
        free(a);


        Ou bien
        int *a;
        /* snip */
        a = malloc(sizeof *a * ymax * xmax);
        if (a == NULL)
                /* erreur */
        /* snip */
        free(a);

        mais ça donnera des accès de la forme a[x*ymax + y].
        • Partager sur Facebook
        • Partager sur Twitter
          8 février 2006 à 13:09:37

          Si c'est un demineur, je pense qu'il devrais y avoir seulement 1 caractere dans une case, enfin si c le cas je continue a penser qu'il faut utiliser un char ** mais si tu veux stocker plus d'un caractere, oui en effet : int ** :D
          • Partager sur Facebook
          • Partager sur Twitter
            8 février 2006 à 13:17:34

            Hum oui oui, c'était juste un type comme ça que j'ai pioché.
            Après, le mieux est d'avoir un typedef par ex pour les cases ou d'utiliser directement une structure.
            • Partager sur Facebook
            • Partager sur Twitter
              8 février 2006 à 13:34:50

              Alors le problème c'est que c'est en C++ donc que je n'utilise pas malloc mais new !

              Voici ce que je fais :
              int** newJeu(int &nbLigs, int &nbCols, float &pourcentage){
                int i, j;

                do{
                  cout << "Entrez le nombre de lignes (entre 10 et 40) : ";
                  cin >> nbLigs;
                }while(nbLigs < 10 || nbLigs > 40);

                do{
                  cout << "Entrez le nombre de colonnes (entre 10 et 40) : ";
                  cin >> nbCols;
                }while(nbCols < 10 || nbCols > 40);

                do{
                  cout << "Entrez le pourcentage de bombes (entre 10 et 30 %) : ";
                  cin >> pourcentage;
                }while(pourcentage < 10 || pourcentage > 30);

                pourcentage /= 100;

                int** grille = new int* [nbLigs];
                for(i = 0; i < nbLigs; i++)
                  grille[i] = new int [nbCols];
               
                return grille;
              }

              void removeGrille(int **grille, int nbLigs, int nbCols){
                int i;
                if(*grille != NULL){
                  cerr << "On commence" << endl;
                  for(i = 0; i < nbLigs; i++){
                    delete grille[i];       // Soit il fait un nouveau Jeu
                    cerr << i << endl;
                  }
                  cerr << "On finit" << endl;
                  delete grille;
                }
                *grille = NULL;
                **grille = NULL;
                cerr << **grille << endl << *grille;
              }

              int main(){
                int **grille, nbLigs, nbCols, pourcentage;                                   // Déclaration du pointeur sur pointeur d'entier contenant la grille

                grille = newJeu(nbLigs, nbCols, pourcentage);

              // Ensuite, si je veux créer une nouvelle partie :

                      removeGrille(grille, nbLigs, nbCols);

              // Et enfin :

                grille = newJeu(nbLigs, nbCols, pourcentage);
              }

              Mais lors du parcours de grille, j'ai des erreurs
               
              • Partager sur Facebook
              • Partager sur Twitter
                8 février 2006 à 13:43:12

                ...
                La logique imparable du C++ veut que l'on utilise delete [] x; pour un tableau, mais bon, après, c'est à toi d'adapter à ton langage, moi je ne fais pas de C++.
                • Partager sur Facebook
                • Partager sur Twitter
                  8 février 2006 à 15:17:05

                  Pourquoi tu ne fais pas de C++ ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 février 2006 à 20:37:08

                    Parce que je trouve ça terriblement laid et inélégant.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 février 2006 à 22:29:32

                      Je suis totalement dacor avec toi Rz0 mais je ne connait pas le C++ n'y a t'il pas plus de possibilité avec le C++ qu'avec le C, ou le C est-il juste plus dure à un certain niveau??
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 février 2006 à 22:39:15

                        En fait la grande différence se situe au niveau des classes !
                        Or pour la Programmation Orienté Objet, on utilise souvent le Java. Le C++ est juste une mise à jour du langage sensé être plus complete et simple.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 février 2006 à 22:58:43

                          Bah, tout est relatif, pour répondre à la question des possiblités, mais le C peut faire exactement les mêmes travaux que le C++ mais différemment : ça a la même "capacité". En pratique, ça ne veut pas dire grand chose. Au niveau des bibliothèques disponibles par ex, concrètement on peut utiliser pratiquement toutes les bibliothèques C depuis le C++ tandis que l'inverse est faux, du coup... Ceci dit, ya une quantité impressionnante de gens qui dév en C et qui font leurs bibliothèques compatibles C.
                          Après, les appels systèmes sont majoritairement accessibles en C de nos jours sur les systèmes d'exploitation. En fait, je ne connais aucun système où le C ne peut pas accéder aux syscalls, mais ça doit exister, notamment historiquement mais de nos jours, je ne sais trop...
                          En plus de ça, les bibliothèques algorithmiques pures sont souvent disponibles en C de même, parce que l'algorithmique n'a pas vraiment besoin de l'objet, sauf si on mix expressément l'un et l'autre.
                          Donc finalement, en C, tu peux bien te démerder et aller très loin... Ce qui ne veut pas dire qu'il ne faut pas apprendre les autres langages, c'est bon pour la culture mais en pratique, je préfère le C.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 février 2006 à 23:05:09

                            Le problème est que pour mon projet de l'IUT, je dois utiliser new et delete []
                            Ceci dit, là, ça doit fonctionner avec vos informations !
                            Mon erreur doit venir d'ailleurs !
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Pointeur comme supprimer un pointeur à 2D ?

                            × 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