Pointeurs et tableaux 2D en C

Résolu
jcl571 -  
jcl571 Messages postés 37 Statut Membre -
Bonjour,
Je sais que l'équivalent en pointeur d'un tableau en 1 dimension donne quelque chose comme ça:
&tab[i] = tab
car tab seul est un pointeur sur le premier élément du tableau.

J'ai fait des test sur des tableaux en 2 dimensions et j'en ai conclu que l'équivalent de:
&tab[i][j] n'est pas tab
Je voudrais donc savoir quel est l'équivalent pour un tableau à 2 dimensions?

La raison est que je voudrais passer mon tableau 2D à une fonction et, question de simplifier l'écriture lorsque j'appellerai la fonction(car toujours écrire &tab[i][j] c'est moins pratique que juste écrire tab)(et sauver de la mémoire, tant qu'a y etre!), je voudrais simplement passer un pointeur qui pointe sur le premier élément.

Merci, j'espere que j'ai été assez clair :P
Configuration: Windows XP
Firefox 3.0.4

4 réponses

  1. Droopy_ Messages postés 252 Statut Membre 25
     
    Je corrige :

    &tab[0] = tab

    tab[0] est le premier élément et & est l'opérateur d'adresse.

    Pour un tableau à deux dimension ça marche pareil,

    &tab[0][0] = tab

    Tu peux donc passer juste tab à ta fonction.
    Il faut par contre que le prototype de la fonction (sa définition) soit correcte.
    3
  2. Droopy_ Messages postés 252 Statut Membre 25
     
    Un exemple :

    void zero(int **t)
    {
    int i,j;
    for(i=0; i<2; i++)
    for(j=0; j<3; j++)
    t[i][j]=0;
    };

    void main()
    {
    int tab[2][3];
    zero(tab);
    };

    Je l'ai pas compilé mais bon ça devrait être ok.
    1
  3. jcl571
     
    Tu as parfaitement raison pour ce qui est de &tab[0] = tab et non &tab[i], merci de la correction :)

    Et j'avais fait un mauvais test pour vérifier l'équivalent, &tab[0][0] est bien équivalent a tab. Je l'avais bien deviné mais j'avais bloqué pour passer le tableau à une fonction, car j'obtiens les 2 warning suivants(ces warning sont obtenus avec la fonction test que tu m'a donnée, mais j'obtiens les même avec mes fonctions):

    warning C4047: 'function' : 'int ** ' differs in levels of indirection from 'int [2][3]'
    warning C4024: 'zero' : different types for formal and actual parameter 1

    Est-ce qu'il y a moyen de ne pas avoir ces warning?(ça marche quand même, mais ça m'irrite d'avoir des warning :P)
    0
    1. Droopy_ Messages postés 252 Statut Membre 25
       
      Sans promesses, j'ai pas de compilo sous la main pour tester,

      Tu as deux choix, changer le prototype (j'en suis pas tout à fait certain) :

      void zero(int t[][])

      Ou alors lors de l'appel et mets :

      zero((int**)tab);

      Ce qui transforme ton tableau à deux dimension en un pointeur de pointeur.
      0
    2. jcl571 > Droopy_ Messages postés 252 Statut Membre
       
      Si je change le prototype pour void zero(int t[][50]) (la 2e dimension doit etre mentionnée si je me souviens bien), est-ce que ça recopie tout le tableau ou seulement l'adresse de la première case?
      0
    3. Droopy_ Messages postés 252 Statut Membre 25 > jcl571
       
      Je sais pas trop.
      J'utilise toujours des pointeurs, comme ça je suis sûr ;-)
      0
    4. jcl571 > Droopy_ Messages postés 252 Statut Membre
       
      C'est ce que j'aimerais faire, mais en plus d'être irritants, les warning sont fortement pénalisés lors de la correction ;)
      0
    5. Droopy_ Messages postés 252 Statut Membre 25 > jcl571
       
      Fais :

      int tab[2][3];

      void zero(int **t)
      {
      ...
      }

      void main()
      {
      zero( (int**) tab);
      }

      Et tu devrais plus avoir de warning.
      0
  4. jcl571 Messages postés 37 Statut Membre
     
    En fait, je ne me sers pas de tableaux de taille 2 et 3, c'était seulement comme exemple :) Mes tableaux sont des tableaux de chaines de caractères de taille 100x51 (des listes de noms et de prénoms).
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Ca change rien. Tu fais passer toujours la taille et l'appel est le même ;)
      0
      1. jcl571 Messages postés 37 Statut Membre > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Je sais :) En tout cas, merci pour tout! Résolu! :)
        0