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

 C Discussion :

tableau 2d dynamique


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1
    Par défaut tableau 2d dynamique
    bonjour, je suis présentement mon premier cours en informatique sur le langage c, je doit faire un tableau dynamique a 2 dimension mais je n'y arrive pas. lorsque j'insère la taille du tableau l'erreur suivante apparait :
    Unhandled exception at 0x01111ba7 in tp2.exe: 0xC0000005: Access violation writing location 0x00000000.
    voici la partie de mon code qui me pose problème

    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
    typedef char** t_tic_tac_toe;
     
    ....
     
    void allouer_espace_mémoire(t_tic_tac_toe* tab_tic_tac_toe,int taille )
    {
     
      int i;
      char** tab=0;
     
         tab_tic_tac_toe = (t_tic_tac_toe*)malloc(taille*sizeof(char*));
     
    	 for(i=0; i< taille;i++)
                   tab[i]=(char*)malloc(taille*sizeof(char)); //ligne qui cause l'erreur
     
    	 return;
    }
    merci

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    1) cacher ton pointeur avec un typedef ne fait que t'embrouiller.
    Si on remplace t_tic_tac_toe par son equivalent ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void allouer_espace_mémoire(char*** tab_tic_tac_toe,int taille )
    Je ne pense pas que c'est ce que tu voulais !


    2) Dans la fonction tu créer un pointeur tab que tu initialise à 0, c'est la plus part du temps equivalent au pointeur NULL. donc pointeur invalide. De toute façon on initialise jamais un pointeur avec une valeur numérique.
    Ensuite tu utilise ce pointeur alors qu'il ne pointe nul part ce qui provoque ton erreur.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 115
    Par défaut
    C'est vrai que le typedef embrouille vite les choses, on ne sait plus trop ce qui est manipule.

    Le fait de passer un char*** en argument me semble approprie a cause du malloc effectue. En revanche dans ce genre de cas je prefere avoir une fonction du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ** allouer_espace_memoire(int taille);
    Je te propose cela :

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    char** allouer_espace_memoire(int taille) {
            int i, j;
            char **tic_tac_toe=NULL;
     
            tic_tac_toe = malloc(taille*sizeof(char*));
            if (!tic_tac_toe) goto out;
     
            for (i = 0; i < taille; i++) {
                    tic_tac_toe[i] = malloc(taille);
                    if (!tic_tac_toe[i]) {
                            for (j = 0; j < i; j++)
                                    if (tic_tac_toe[j]) free(tic_tac_toe[j]);
                            if (tic_tac_toe) free(tic_tac_toe);
                            tic_tac_toe = NULL;
                            break;
                    }
            }
     
    out:
            return tic_tac_toe;
    }
     
     
    int  main(void)
    {
            char **tic_tac_toe=NULL;
     
            tic_tac_toe = allouer_espace_memoire(10);
            if (tic_tac_toe) {
                    tic_tac_toe[9][9] = 'a';
                    printf("tic_tac_toe[9][9] = %c\n", tic_tac_toe[9][9]);
            }
     
            return 0;
    }
    Pour info vu que tu debutes, il faut penser a controller le retour des fonctions, surtout les allocations, peu de chances que cela ne marche pas mais tu eviteras les segfaults. Attention au goto, les profs n'aiment pas trop. Ici il permet de n'avoir qu'un seul return pour la fonction sans s'embeter.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @Odulo :
    Je crois que ta fonction marche correctement mais
    - remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if (!tic_tac_toe) return NULL;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if (!tic_tac_toe) goto out;
    ...
    out:
            return tic_tac_toe;
    ne me semble pas aboutir à une amélioration de la clarté du code ni un bon conseil à donner.

    - il y a beaucoup de tests inutiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (j = 0; j < i; j++)
         if (tic_tac_toe[j]) free(tic_tac_toe[j]);
    if (tic_tac_toe) free(tic_tac_toe);
    Si on est sur ces lignes de code, on est assuré que tic_tac_toe et tic_tac_toe[j] sont différents de NULL

    Une version de ta fonction sans goto ni break :
    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
    char** allouer_espace_memoire(int taille)
    {
       int i, j;
       char **tic_tac_toe = malloc(taille*sizeof(char*));
       for (i = 0; tic_tac_toe != NULL && i < taille ; i++)
       {
          tic_tac_toe[i] = malloc(taille);
          if (tic_tac_toe[i] == NULL)
          {
             for (j = 0; j < i; j++) free(tic_tac_toe[j]);
             free(tic_tac_toe);
             tic_tac_toe = NULL;
          }
       }
       return tic_tac_toe;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 115
    Par défaut
    @diogene

    Le goto n'est pas vraiment la pour la clarte mais pour avoir un seul return. Je pense qu'il y a deux ecoles sur ce sujet. Certains semblent avoir ete traumatises par des debogueurs qui n'aimaient pas trop avoir plusieurs return dans une meme fonction. Mais effectivement la maniere dont tu as ecrit ta fonction permet de s'en passer et est plus propre.

    Je suis tout a fait d'accord pour le test des pointeurs avant de faire le free dans notre cas ils sont inutiles mais c'est une habitude prise qui peut etre bien utile je pense (enfin avec une petite macro c'est mieux).

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par Odulo Voir le message
    .....Je suis tout a fait d'accord pour le test des pointeurs avant de faire le free dans notre cas ils sont inutiles mais c'est une habitude prise qui peut etre bien utile je pense (enfin avec une petite macro c'est mieux).
    Une petite précision : Il est possible de faire free(NULL) sans problèmes (dans ce cas la fonction ne fait rien). Il n'est donc pas obligatoire de tester un pointeur par rapport à NULL avant le free().

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 115
    Par défaut
    Oui effectivement, j'ai eu le soucis en embarque, donc cela doit dependre de l'implementation.

Discussions similaires

  1. filtrer tableau croisé dynamique sous excel
    Par kernel57 dans le forum Excel
    Réponses: 7
    Dernier message: 17/11/2006, 14h18
  2. Tableau croisé dynamique
    Par papy_tergnier dans le forum Access
    Réponses: 5
    Dernier message: 26/12/2005, 18h05
  3. tableau croisé dynamique sous delphi, comment ?
    Par Brice Yao dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/07/2005, 09h33
  4. Tableau ouvert / dynamique ?
    Par Dry dans le forum Langage
    Réponses: 2
    Dernier message: 24/06/2004, 11h54
  5. [Tableau] Allocation dynamique du contenu
    Par VincenzoR dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 08/05/2004, 20h57

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