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 2 dimentions, pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2
    Par défaut Tableau 2 dimentions, pointeur
    Bonsoir,
    Je débute en C et je bloque au niveau des tableaux.

    j'essai de remplir un tableau à 2 dimention avec 0;
    Lors de la compilation du code suivant, il n'y a pas d'erreur de compilation, mais à l'utilisation, je saisi 3 ça marche, mais avec 5 ça bug, d'ou cela vient t'il?

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
        int nbr;
        int a, b, c;
        int carreMag[nbr][nbr];
        int *pcarre;
        pcarre = (int*)malloc(sizeof(int)*nbr*nbr);
        int point;
     
        /* Contrôle de la valeur entrée */
        do              
        {
              printf("Entrer un nombre impair : ");
              scanf("%d",&nbr);
        }while((nbr%2)==0);
     
       /* Initialisation des valeurs du tableau à 0*/
       for(a=0; a<nbr; a++)
       {
                for(b=0; b<nbr; b++)
                {
                 carreMag[a][b]=0;
                 printf("[a%d] [b%d] = %d | ", a, b, carreMag[a][b]);
                }
     
                printf("\n");        
       }
     
         free(pcarre);
     
      system("PAUSE");	
      return 0;
    }
    [/code]

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Tableau 2 dimentions, pointeur
    Citation Envoyé par DidierMesenbourg
    j'essai de remplir un tableau à 2 dimensions avec 0;
    Lors de la compilation du code suivant, il n'y a pas d'erreur de compilation, mais à l'utilisation, je saisi 3 ça marche, mais avec 5 ça bug, d'ou cela vient t'il?
    Ton code met en oeuvre un concept nouveau du langage C (C99) appelé VLA (Variable Lenth Array). Le comportement est indéfini parce que la valeur de nbr est indéfinie au moment où le tableau carreMag est défini.

    D'autre part, tu utilises une définition dynamique du tableau basée sur le fait qu'un tableau à 2 dimensions est linéaire (ce qui est correct), mais curieusement, tu n'exploites pas ce code (il est non inutile ici).

    N'étant pas un grand fan des VLA que je trouve dangereux, je propose de développer le principe du tableau 2D avec un malloc(). Le problème est l'accès aux éléments du tableau, car évidemment la notation [][] ne convient pas (la tableau n'a qu'une dimension). Le principe est donc de calculer l'adresse de l'éléments à partir des paramètres connus (adresse de base, taille d'une dimension) et des éléments variables (coordonnées x et y). C'esr le rôle de la macro ADR (qui pourrait aussi bien être une fonction)

    Ton code corrigé. Pose des questions si tu ne comprends pas.
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define ADR(p, n, x, y) \
       ((p)+((x)*(n)+(y)))
     
    int main (void)
    {
       int nbr;
     
       /* Controle de la valeur entree */
       {
          int ret;
          do
          {
             printf ("Entrer un nombre impair : ");
             ret = scanf ("%d", &nbr);
          }
          while (ret != 1 && (nbr % 2) == 0);
       }
     
       {
          int *p_carreMag = malloc (sizeof *p_carreMag * nbr * nbr);
          /* Initialisation des valeurs du tableau à 0 */
     
          if (p_carreMag != NULL)
          {
             int a, b;
             for (a = 0; a < nbr; a++)
             {
                for (b = 0; b < nbr; b++)
                {
                   *ADR (p_carreMag, nbr, a, b) = 0;
                   printf ("[a%d] [b%d] = %d | ", a, b, *ADR (p_carreMag, nbr, a, b));
                }
     
                printf ("\n");
             }
             free (p_carreMag),p_carreMag=NULL;
          }
       }
       system ("PAUSE");
       return 0;
    }
    Nota : concernant les entrées, scanf() est déconseillée, car difficile à mettre en oeuvre correctement.

    http://emmanuel-delahaye.developpez....tes.htm#saisie

  3. #3
    Membre Expert

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Par défaut
    Ta daclaration de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int carreMag[nbr][nbr];
    ne vas pas du tout... D'ailleur, si tu compile ce code, tu as pas mal de Warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foo.c: In function `main':
    foo.c:9: warning: ISO C90 forbids variable-size array `carreMag'
    foo.c:9: warning: ISO C90 forbids variable-size array `carreMag'
    foo.c:12: warning: ISO C90 forbids mixed declarations and code
    foo.c:8: warning: unused variable `c'
    foo.c:12: warning: unused variable `point'
    à l'utilisation, je saisi 3 ça marche, mais avec 5 ça bug, d'ou cela vient t'il?
    Ca dépends de ton OS / compilateurs... Par exemple, chez moi ca segfault avant meme de me demander la taille....

    Bref, la solution c'est de déclarer ton tableau convenablement (Tu ne peux pas déclarer un tableau statique dont les dimensions sont saisies par l'utilisateur)... Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        int * carreMag;
    [...]
        carreMag = (int *)malloc(nbr*nbr*sizeof(int));
        if (NULL == carreMag) {
            fprintf(stderr,"Out of memory !\n");
            return 1;
        }
    [...]
                carreMag[a*nbr+b]=0;
    [...]
    Au passage, ne pas oublier de vérifier systématiquement que malloc n'échoue pas .... Ca evite d'aller écrire des trucs ou les lire en passant par le pointeur NULL....

    Et là, ca devrait aller un peu mieux

    -- edit --

    On m'est passé devant ....

    Si tu veux conserver la syntaxe [...][...] tu peux faire l'initialisation de ton tableau comme cela (Matrice de L lignes et C colones) :
    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
        short int ** Mat;
    [...]
        Mat = (short int **) malloc(sizeof(short int *)*L);
        if (NULL == Mat)
            return 1;
     
        for (i=0;i<L;i++) { 
            Mat[i] = (short int *) malloc(sizeof(short int)*C);
            if (NULL == Mat)
                return 1;
     
            for (j=0;j<C;j++) {
                /*printf("Mat[%d][%d] : ",i,j);*/
                scanf("%hd",&Mat[i][j]);
            }
        }

  4. #4
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    si tu tiens vraiment à pouvoir utiliser 2 indices (carreMag[i][j]) regarde la FAQ-C : http://c.developpez.com/faq/c/?page=...bleau_2D_alloc
    il faudra rajouter des tests pour vérifier le retour des malloc()

    mais à mon avis les 2 solutions précédentes (ainsi que la méthode 2 de la faq) sont meilleurs car elle ne font qu'un appel à malloc()

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2
    Par défaut Cool
    Merçi à tous pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tableau a dimention variable
    Par dionisos56 dans le forum C++
    Réponses: 7
    Dernier message: 25/11/2007, 13h40
  2. lire un tableau grace à un pointeur
    Par Linu6 dans le forum Débuter
    Réponses: 5
    Dernier message: 22/09/2007, 15h48
  3. [Prototype] Tableau à deux dimentions
    Par CrazySeb dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 04/07/2007, 11h04
  4. Réponses: 8
    Dernier message: 11/03/2007, 18h10
  5. tableau deux dimentions
    Par tinobimbo dans le forum Flash
    Réponses: 2
    Dernier message: 18/07/2006, 13h12

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