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 :

passage en parametre de fonction : tableau a deux dimensions


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut passage en parametre de fonction : tableau a deux dimensions
    bonjour
    j'aimerais effectuer un passage en parametre de fonction pour tableau a deux dimensions;
    au depart je le faisais pas valeur (c'est lourd et interdit)
    donc je voudrais le faire par adresse mais j'ai un probleme :

    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
    #include <stdlib.h>
    #include <stdio.h>
     
    void affiche_map(int **);
     
     
    void main (void)
     
    {
    	int Map[5][6];
     
     
    	affiche_map(Map);
     
    }
     
     
     
     
    void affiche_map(int **Map)
    {    
    	for ( int i =0 ; i < 5 ; i++ )
    		for ( int j=0 ; j< 6 ; j++)
    			printf("%d",Map[i][j]);
    }
    mais voila apparemment cela ne fonctionne pas comme les tableaux a une dimension ou j'ai juste a mettre void affiche_map(int *);

    Cordialement Bruno

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: passage en parametre de fonction : tableau a deux dimens
    Citation Envoyé par bonjour69
    j'aimerais effectuer un passage en parametre de fonction pour tableau a deux dimensions <...> mais voila apparemment cela ne fonctionne pas comme les tableaux a une dimension ou j'ai juste a mettre void affiche_map(int *);
    Ben non... Qui a pu te mettre dans la tête qu'il fallait 2 étoiles ?

    http://emmanuel-delahaye.developpez.....htm#param_tab
    Pas de Wi-Fi à la maison : CPL

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le problème, c'est que int map[5][6] est un tableau à deux dimensions, mais un seul tableau quand même, et non pas un tableau de pointeurs.

    C'est donc plus un int * qu'un int **, mais je ne suis pas sûr qu'un int * soit accepté.
    En fait, le "bon" protptype pour la fonction serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affiche_map(int Map[][6]);
    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.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    En fait, le "bon" protptype pour la fonction serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affiche_map(int Map[][6]);
    Un des bons prototypes...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affiche_map(int Map[5][6]);
    est aussi valide.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void affiche_map(int Map[][6]);
    void affiche_map(int Map[5][6]);
    sont valides, certes, mais ont le défaut qu'ils ne représentent pas ce qu'est la variable Map dans la fonction : Map n'est pas un tableau. Cette notation (relativement cool) est interprétée par le compilateur pour obtenir le véritable type de Map exprimé par le prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affiche_map(int (*Map)[6]);
    car il correspond à ce qu'est Map dans la fonction : un POINTEUR sur un tableau de 6 int
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par diogene
    Cette notation (relativement cool) est interprétée par le compilateur pour obtenir le véritable type de Map exprimé par le prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affiche_map(int (*Map)[6]);
    car il correspond à ce qu'est Map dans la fonction : un POINTEUR sur un tableau de 6 int
    Oui, mais ça complique. Il faut passer l'adresse du tableau (&tab), ajouter une * : (*p_tab)[i] pour accéder à un élément, la taille est dans le type, donc la maintenance est aussi cauchemardesque...

    Bref, d'après ce que j'ai pu constater en 15 ans de métier, l'usage des pointeurs de tableau est extrèmement rare...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut bonjour
    Bonjour


    mais ceci ne correspond pas a un passage par valeur ??
    j'ai l'impression qu'on recopie le tableau je dois me tromper non ?

    merci cordialement Bruno

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: bonjour
    Citation Envoyé par bonjour69
    mais ceci ne correspond pas a un passage par valeur ??
    j'ai l'impression qu'on recopie le tableau je dois me tromper non ?
    Tous les paramètres sont passés par valeur en C. Mais pour les tableaux, la valeur passée est
    Dans les deux cas, la seule chose qui est transmise (copiée) est une adresse, soit quelques bytes, quelque soit la taille du tableau.
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Emmanuel :
    Bref, d'après ce que j'ai pu constater en 15 ans de métier, l'usage des pointeurs de tableau est extrèmement rare...
    Oui, c'est exact car les déclarations sont plus lourdes et moins parlantes pour la plupart des lecteurs du code. Remarque, il ne s'agit pas là de pointeur sur tableau, mais de pointeur sur élément du tableau.
    Toutefois, la notation "allégée"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affiche_map(int Map[][6]);
    présente l'inconvénient de présenter la variable locale Map sous un type tableau ce qu'elle n'est pas (elle est d'un type pointeur). Ceci est une source d'erreurs pour ceux qui débutent (et quelquefois les autres) qui pensent, comme bonjour69, que, suivant le principe général de la gestion des paramètres du C , Map est un tableau local initialisé par copie lors de l'appel :
    bonjour69 :
    mais ceci ne correspond pas a un passage par valeur ??
    j'ai l'impression qu'on recopie le tableau je dois me tromper non ?
    De plus, ils ont de très mauvaises surprises dans l'utilisation de sizeof(Map) dans la fonction. Ceci oblige à créer un cas d'exception pour l'interprétation des paramètres dans le cas des tableaux .
    Il faut passer l'adresse du tableau (&tab), ajouter une * : (*p_tab)[i] pour accéder à un élément, la taille est dans le type, donc la maintenance est aussi cauchemardesque...
    Non, le reste est inchangé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void affiche_map(int (*map)[6])
    {
    map[1][0] = ....
    } 
    .....
    int Map[5][6];
    affiche_map(Map);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut fh
    Bonjour

    je vous remercie tout marche nickel encore une fois !
    A bientot !

    Cordialement Bruno

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par diogene
    De plus, ils ont de très mauvaises surprises dans l'utilisation de sizeof(Map) dans la fonction. Ceci oblige à créer un cas d'exception pour l'interprétation des paramètres dans le cas des tableaux .
    Il faut passer l'adresse du tableau (&tab), ajouter une * : (*p_tab)[i] pour accéder à un élément, la taille est dans le type, donc la maintenance est aussi cauchemardesque...
    Non, le reste est inchangé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void affiche_map(int (*map)[6])
    {
    map[1][0] = ....
    } 
    .....
    int Map[5][6];
    affiche_map(Map);
    Ok. S'agissant d'un tableau à deux dimensions, tu utilises une notation hybride, à savoir que le pointeur de tableau contient l'adresse du premier tableau... C'est très complexe, et j'imagine assez destabilisant pour un débutant. Je pense qu'il vaut mieux s'en tenir à la notation de bas et passer les tailles en paramètre.

    Sinon, il y a toujours l'alternative du tableau de pointeurs, mais ça prend un peu plus de place et ce n'est pas linéaire...
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Emmanuel :
    C'est très complexe, et j'imagine assez destabilisant pour un débutant
    Oui, c'est vrai. Il y a un problème d'interprétation de la syntaxe qui n'est pas immédiat. A une dimension, c'est bon (int * tab) , à plus de dimensions, ce n'est pas très accoutumé A coté de ça, regarde les erreurs conceptuelles induites par la notation tableau chez les débutants. Alors, que choisir ?? le ne sais pas
    tu utilises une notation hybride, à savoir que le pointeur de tableau contient l'adresse du premier tableau..
    Plus exactement,...que le pointeur contient l'adresse du premier tableau.
    J'écris simplement le type réel du paramètre local obtenu (qui est aussi le type de l'argument lors de l'appel utilisant l'identificateur du tableau) tel que le construit le compilateur.
    Sinon, il y a toujours l'alternative du tableau de pointeurs, mais ça prend un peu plus de place et ce n'est pas linéaire...
    qu'entends-tu par non linéaire ?
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par diogene
    Sinon, il y a toujours l'alternative du tableau de pointeurs, mais ça prend un peu plus de place et ce n'est pas linéaire...
    qu'entends-tu par non linéaire ?
    Chaque pointeur de la dimension 2 pointe sur un tableau de la dimension 1. Il n'y a plus 1 bloc mémoire comme dans un tableau à 2D, mais un bloc pour le tableau de pointeurs et N blocs pour les tableaux de dimension 1. La création d'un tel tableau est dynamique.
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Emmanuel
    et N blocs pour les tableaux de dimension 1.
    On peut avoir un bloc unique (qui est plus facile à créer et en allocation dynamique à détruire)
    La création d'un tel tableau est dynamique.
    Si tu entends par là par allocation dynamique, ce n'est pas obligatoire. Mais de toute façon, la construction demande presque obligatoirement du code:
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int * Tab[N];
    int data[N*M];
    int i;
    for(i=0;i<N;i++) Tab[i] = data+M;
    .....
    Tab[i][j] = ...
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/11/2007, 19h36
  2. Réponses: 11
    Dernier message: 27/06/2007, 15h06
  3. Réponses: 7
    Dernier message: 16/04/2007, 13h39
  4. [VBA-E]passage de parametre à une fonction
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/02/2006, 17h51
  5. Passage en parametre d'un tableau
    Par hak5 dans le forum C
    Réponses: 3
    Dernier message: 13/01/2006, 11h32

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