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 :

pointeur de pointeurs et syntaxe crochet


Sujet :

C

  1. #1
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut pointeur de pointeurs et syntaxe crochet
    La Faq C sur les tableaux montre que pour passer un tableau a une fonction on peut utiliser un pointeur en paramètre (montrant explicitement la conversion du tableau t vers un pointeur).

    Comme c'est un tableau qui est passé, on aurai aussi pu écrire. (peut être a placer dans la faq ?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void initialiser_tab_2(int  ptr[][4], size_t N, size_t M)
    {        
        size_t j, i;
     
        for(j = 0; j < N; j++)
        {
            for(i = 0; i < M; i++)
            {
                ptr[j][i]= (int)j;
            }
        }
    }
    * Dans le cas où l'on passe un pointeur de pointeurs, est on alors obligé d'utiliser la méthode montrée dans la faq avec ptr[M * j + i] <=> t[j][i] ou bien existe il un moyen d'avoir la syntaxe crochet (à mon avis non car on passe un pointeur, mais je demande quand même) ?

    *Comment adapter expression ptr[M * j + i] pour un tableau (ou pointeurs) de 3 à N dimensions ? Existe il une 'suite logique' pour déduire facilement qui multiplie quoi ?

  2. #2
    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
    1-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void initialiser_tab_2(int  ptr[][4], size_t N, size_t M)
    ....
    La méthode que tu évoques est la méthode normale de passage d'un tableau 2D à une fonction. Par contre, la présence (obligatoire) du '4' limite alors la fonction aux tableaux int tab[...](4] et M doit être égal à 4 (ce qui rend le passage de ce paramètre inutile).
    L'exemple de la FAQ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void initialiser_tab_2(int * ptr, size_t N, size_t M)
    ....
    est fait pour permettre d'utiliser la fonction quel que soit N et M. Sur l'exemple de la FAQ, on peut discuter sur la précision du commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        /* &(t[0][0]) peut egalement s'ecrire t[0] ou encore (int *)t */
        initialiser_tab_2(&(t[0][0]), N, M);
    &t[0][0] (un int *) n'est pas identique à t[0] (qui est un tableau : un int [4]) mais le commentaire est bien exact dans ce contexte d'utilisation. Peut-être aurait-il été préférable d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /* A la place de &(t[0][0]), on peut également écrire ici t[0] ou (int *)t */

    2-
    * Dans le cas où l'on passe un pointeur de pointeurs, est on alors obligé d'utiliser la méthode montrée dans la faq avec ptr[M * j + i] <=> t[j][i] ou bien existe il un moyen d'avoir la syntaxe crochet (à mon avis non car on passe un pointeur, mais je demande quand même) ?
    Si tu veux dire que dans ce cas, on veut passer un int**, c'est carrément faux : il n'y a pas ici de tableaux de pointeurs.

    3-
    *Comment adapter expression ptr[M * j + i] pour un tableau (ou pointeurs) de 3 à N dimensions ? Existe il une 'suite logique' pour déduire facilement qui multiplie quoi ?
    Si le tableau est int tab[N1][N2]...[NP] et qu'on le passe par pointeur int ptr* sur le premier int, l'accès à l'élément tab[i1][i2]...[iP] se fera par :
    ptr[i1*N2*N3*...NP + i2*N3*...NP +...+ iP-1*NP + iP]
    ou
    ptr[ SOMME(k=1 à P-1; ik*PRODUIT(m=k+1 à P; Nm)) + iP]

  3. #3
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut
    Merci pour toutes ces précisions.

    Au passage, on voit pourquoi il est inutile de préciser la taille de la premiere dimension d'un passage de tableau, l'expression mathématique montré en C est alors pour un tableau [M][N][P] à l'emplacement i j k de (i*N*P)+(j*P)+k)

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

Discussions similaires

  1. Pointeurs et pointeurs de pointeurs
    Par wallace27 dans le forum C
    Réponses: 10
    Dernier message: 09/04/2015, 22h07
  2. Réponses: 21
    Dernier message: 06/08/2009, 09h31
  3. Réponses: 6
    Dernier message: 26/05/2007, 00h33
  4. Réponses: 2
    Dernier message: 11/04/2007, 22h34
  5. pointeur sur pointeur
    Par gaut dans le forum C
    Réponses: 3
    Dernier message: 01/11/2005, 21h30

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