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 dynamique à 2 dimension


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Par défaut tableau dynamique à 2 dimension
    Bonjour,

    Une question qui a sans doute été posée de nombreuses fois, mais je n'ai pas trouvé la réponse.

    Dans le code suivant :

    double (*a)[2] = malloc(2*L*sizeof(double));

    a est un pointeur sur un tableau de double, qui pointe sur un espace mémoire alloué par malloc où il y a la place pour 2*L doubles (ou encore L tableau de 2 double...).

    Ce que je ne comprends pas, c'est la manière dont on accède aux éléments.
    On écrit : a[i][j], pour accéder à l'élément (i,j)
    Mais quand on écrit a[i][j], ce que je comprends c'est que a[i] est un pointeur et on regarde ce qui est pointé j cases mémoire plus loin pour avoir
    a[i][j] (soit *(j + a[i]) ). Cependant, le malloc n'a pas alloué de place pour des pointeurs intermédiaires a[i]... Alors je ne comprends pas.

    Est ce que cette manière de procéder est 'légale' est C, ou bien s'agit-il d'un 'abus de langage' qui est toléré?

    J'espère que je n'ai pas endormi les courageux qui auront lu le post jusqu'au bout.

    Merci

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Pour l'allocation d'un tableau dynamique de dimension [dim_x,dim_y] je le ferai plutôt comme ça, et la on peu acceder a l'élément [i][j] par ppData[i][j]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      int **ppData;
      ppData = malloc(dim_x*sizeof(int*));
     
      for(int i=0; i<dim_x; i++) {
         ppData[i] = malloc(dim_y*sizeof(int));
      }
    ou bien, mais cela implique de gérer soit même le calcul de la position dans le tableau, on accede a l'element [i][j] avec ppData[j + dim_x * i]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      int *ppData;
      ppData = malloc(dim_x*dim_y*sizeof(int*));

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Par défaut
    Merci pour ta réponse jabbounet, mais ma question n'est pas de savoir comment on crée un tableau à deux dimension de manière dynamique, mais de comprendre comment et pourquoi la méthode que je décris fonctionne.

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par jc_devc Voir le message
    Merci pour ta réponse jabbounet, mais ma question n'est pas de savoir comment on crée un tableau à deux dimension de manière dynamique, mais de comprendre comment et pourquoi la méthode que je décris fonctionne.

    Tout simplement par qu'en fait les tableaux deux dimensions sont en fait N tableau a 1 dimension (a[i]), a[i][j] correspond a (a[i])[j]

    l'explication sera plus claire ici
    http://www.ibiblio.org/pub/languages.../append-c.html

  5. #5
    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
    ...Mais quand on écrit a[i][j], ce que je comprends c'est que a[i] est un pointeur et on regarde ce qui est pointé j cases ....
    Il ne faut pas confondre "valeur adresse" et "objet pointeur".

    Très souvent, on emploie le terme pointeur par commodité pour les deux, comme on dit : "2 est un int" (pour dire que c'est une valeur de type int) et pour int i; que i est un int (pour dire que c'est un objet de type int).
    Si cet usage ne pose pas de problèmes pour les int, il engendre certaines ambiguités dans le cas des pointeurs (certainement dues à leur couplage avec les tableaux qui sont des engins assez compliqués en C).

    Le nom d'un tableau (hors associé aux opérateurs sizeof et & (adresse de)) désigne une valeur adresse, pas un objet pointeur (et c'est pour ça qu'on ne peut écrire tableau = quelque chose comme on ne peut écrire 2 = quelque chose).
    Comme a[i] est du type tableau, ce sera une valeur adresse (Si a était à une dimension, a[i] serait un objet). a[i] n'a pas d'adresse : si j'écris &a[i] je n'obtiens pas l'adresse d'un pointeur, mais l'adresse d'un "sous-tableau" de a.


    Dans le cas d'une valeur adresse et si on veut conserver le terme pointeur comme nom du type, on devrait dire plutôt utiliser le terme "constante pointeur" (à ne pas confondre avec un pointeur constant) (comme on peut dire que 2 est une constante int). C'est cette expression qui est utilisée, je crois, dans la norme qui réserve le terme "valeur" au résultat d'une évaluation (résultat qui peut être un objet).

    Personnellement, je trouve plus clair d'utiliser comme nom du type "adresse", de parler de valeurs (de type) adresse (ou plus simplement d' "adresses") et de réserver le terme "pointeurs" aux objets (de type) adresse.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    La solution que je préconise, pour un tableau à deux dimensions, et un compromis entre les deux extrêmes de Jabbounet.
    Une allocation par dimension
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Tableau dynamique à deux dimensions
    Par David Fouejio dans le forum MFC
    Réponses: 4
    Dernier message: 05/03/2007, 09h37
  2. [HashSet] Tableau dynamique à 2 dimensions
    Par ppopov dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 21/01/2007, 16h21
  3. Réponses: 4
    Dernier message: 19/12/2006, 20h06
  4. declaration d'un tableau dynamique 2 dimensions
    Par mike600river dans le forum C++Builder
    Réponses: 4
    Dernier message: 22/05/2006, 08h53
  5. Réponses: 1
    Dernier message: 09/03/2006, 17h25

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