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 dimension en parametre d'une fonction


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Tableau 2 dimension en parametre d'une fonction
    Bonjour,

    Je souhaite faire passer un tableau a 2 dimensions en parametre d'une fonction.
    Je ne comprend pas pourquoi le code ci dessous ne marche pas, d'après les forums que j'ai lus ca devrait marcher.
    (Je ne dois utiliser l'allocation dynamque)

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void display_grid(int **grid);
    int width = 10;
    int height =20;
     
    int main()
    {
     
    	int i,j;
    	int grid[width][height];
    			for(i=0;i<height;i++)
    			{
    				for(j=0;j<width;j++)
    				{
    					grid[j][i] = i+j; //fill up the grid with *
    				}
    			}
    	display_grid(grid[][height])
    		return 0;
    }
     
    void display_grid(int **grid) //display the grid
    {
    	int i,j;
    	for(i=0;i<height;i++)
    	{
    	printf("|");
    		for(j=0;j<width;j++)
    		{
    				printf("%d",grid[j][i]);
    		}
    	printf("|\n");
    	}
     
    }
    Si quelqu'un peu m'éclairer.

    Merci

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Tu peux essayer cela, meme si ce n'est pas super beau....

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    const int width = 10;
    const int height =20;
     
    void display_grid(int grid[][height]);
     
    int main()
    {
     
    	int i,j;
    	int grid[width][height];
    			for(i=0;i<height;i++)
    			{
    				for(j=0;j<width;j++)
    				{
    					grid[j][i] = i+j; //fill up the grid with *
    				}
    			}
    		display_grid(grid);
    		return 0;
    }
     
    void display_grid(int grid[][height]) //display the grid
    {
    	int i,j;
    	for(i=0;i<height;i++)
    	{
    	printf("|");
    		for(j=0;j<width;j++)
    		{
    				printf("%d",grid[j][i]);
    		}
    	printf("|\n");
    	}
     
    }

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par karbox Voir le message
    Je ne comprend pas pourquoi le code ci dessous ne marche pas, d'après les forums que j'ai lus ca devrait marcher.
    (Je ne dois utiliser l'allocation dynamque)
    Parce que tu confonds tableaux et pointeurs...

    La fonction display attend un pointeur de pointeur.
    D'une part tu déclares ce que tu vas lui passer comme un tableau prédfini, et surtout tu lui passes un type ne correspondant pas à ce qu'elle attend..

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void display_grid(int **grid);
    ...
    void display_grid(int grid[][height]) //display the grid


    La solution simple et logique est :


    Code C : 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void display_grid(int **grid);
    int width = 10;
    int height =20;
    	
    int main()
    {
    	
    	int i,j;
    	int grid[width][height];
    			for(i=0;i<height;i++)
    			{
    				for(j=0;j<width;j++)
    				{
    					grid[j][i] = i+j; /*fill up the grid with */
    				}
    			}
    	display_grid(grid);
    		return 0;
    }
     
    void display_grid(int **grid) /*display the grid*/
    {
    	int i,j;
    	for(i=0;i<height;i++)
    	{
    	printf("|");
    		for(j=0;j<width;j++)
    		{
    				printf("%d",grid[j][i]);
    		}
    	printf("|\n");
    	}
    			
    }


    Par contre, d'une part il serait préférable d'utiliser de l'allocation dynamique, d'autre part il serait très nettement conseillé de passer les dimensions comme arguments et non en tant que variables globales...


    Enfin c'est au minimum int main (void)..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    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
    @souviron34 :
    La solution simple et logique est :.....
    Mais cette solution est fausse : pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void display_grid(int **grid);
    l'argument attendu est l'adresse d'un pointeur sur int ou un tableau de pointeurs sur int ce que n'est pas grid dans int grid[width][height] qui lui est un tableau de tableaux de int.
    Le type du paramètre, si on veut passer grid en argument, doit être "adresse d'un tableau de height int" soit int (*)[height].

    On doit donc déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void display_grid(int (*grid)[height]);
    ou son équivalent (déjà donné par Ipconfig)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void display_grid(int grid[][height]);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    grid n'est pas équivalent à &(grid[0][0]) ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    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
    Citation Envoyé par souviron34 Voir le message
    grid n'est pas équivalent à &(grid[0][0]) ??
    Non, le type n'est pas le même.
    grid , dans le contexte considéré, est équivalent à &grid[0] (et de type int (*)[height])
    C'est grid[0] qui serait équivalent à &grid[0][0] (et de type int *)

    Pour la fonction :
    Si le type de paramètre est int **grid, alors entre grid[0] et grid[1] il y a sizeof(int*) bytes ce qui ne correspond pas à la structure du tableau passé en argument.
    Si le type de paramètre est int (*grid)[height], entre grid[0] et grid[1] il y a bien height*sizeof(int) bytes.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ok alors autant pour moi...


    Comme je ne manipule de toutes façons jamais des tableaux pré-alloués, surtout à plusieurs dimensions, et que surtout je ne définis jamais de fonctions ayant pour paramètre de tels tableaux, je n'ai jamais rencontré le problème...

    Je me coucherai moins bête ce soir
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. [PHP 5.2] [Tableaux] Tableau multi-dimension en argument d'une fonction
    Par dkmatt dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2009, 16h54
  2. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 15h00
  3. Réponses: 3
    Dernier message: 05/10/2005, 17h26
  4. Passer un tableau en parametre dans une fonction js
    Par hellmaster78 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/06/2005, 14h35
  5. tableau dynamique en parametre d'une fonction
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 27/04/2004, 16h35

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