Précédent   Forum du club des développeurs et IT Pro > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/03/2011, 15h23   #1
karbox
Invité de passage
 
Inscription : avril 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 12
Points : 4
Points : 4
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 :
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
karbox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 17h44   #2
Ipconfig
Invité régulier
 
Homme
Ingénieur développement logiciels
Inscription : 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 : 6
Points : 6
Tu peux essayer cela, meme si ce n'est pas super beau....

Code :
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");
	}
 
}
Ipconfig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 12h25   #3
souviron34
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 9 593
Détails du profil
Informations personnelles :
Âge : 55

Informations forums :
Inscription : janvier 2007
Messages : 9 593
Points : 11 930
Points : 11 930
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 :
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 :
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
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 14h01   #4
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 437
Détails du profil
Informations personnelles :
Nom : Homme Patrick Gonord
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Enseignement

Informations forums :
Inscription : juin 2005
Messages : 5 437
Points : 12 977
Points : 12 977
@souviron34 :
Citation:
La solution simple et logique est :.....
Mais cette solution est fausse : pour
Code :
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 :
void display_grid(int (*grid)[height]);
ou son équivalent (déjà donné par Ipconfig)
Code :
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 !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 14h37   #5
souviron34
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 9 593
Détails du profil
Informations personnelles :
Âge : 55

Informations forums :
Inscription : janvier 2007
Messages : 9 593
Points : 11 930
Points : 11 930
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
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 15h30   #6
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 437
Détails du profil
Informations personnelles :
Nom : Homme Patrick Gonord
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Enseignement

Informations forums :
Inscription : juin 2005
Messages : 5 437
Points : 12 977
Points : 12 977
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 !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 16h12   #7
souviron34
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 9 593
Détails du profil
Informations personnelles :
Âge : 55

Informations forums :
Inscription : janvier 2007
Messages : 9 593
Points : 11 930
Points : 11 930
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
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h59.


 
 
 
 
Partenaires

Hébergement Web