Tableaux multidimentionnels

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 15 janv. 2004 à 18:28
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 16 janv. 2004 à 06:01
j'ai une petite question à propos des tableaux multidimentionnels: comment doit on déclarer un argument formel pour un tableau de ce type dans une fonction
Si je je le fais de la manière suivante
int f(int** t, int n)

j'obtiens une erreur à la compilation avec
int t[2][2]
f(t, 2)

et une erreur à l'éxécution avec
int t[2][2]
f((int**)t, 2)

Merci pour vos réponses

15 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 janv. 2004 à 18:28
je crois que j'ai oublié des ';' un peu partout
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
15 janv. 2004 à 18:32
int f ( int *t[2]);

...

int t[2](2];
f(t);
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 janv. 2004 à 18:34
oui ca je sais mais le problème c'est que je ne connais rien qui concerne la taille tu tableau, j'utilise un autre parametre (n) por ca
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 janv. 2004 à 18:38
je pense que je vais lui passer seulement t[0] et je vais me demerder
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
15 janv. 2004 à 18:41
ba essay ca mais attention j'ai po tester je sai juste que ca compile!

void f(int **t)
{
}

void main()
{
int t[2][2];

int **p=(int**)t;

f(p);
}
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
15 janv. 2004 à 18:47
desole j'avais pas vu que t'avai deja essayer ca
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
15 janv. 2004 à 18:52
en attendant tu peut simuler un tableau 2d avec un tableau 1d, ca se fait aussi
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
15 janv. 2004 à 19:04
je croi que j'ai trouver un moyen (ca marche masi je sais pas si c'est propre)

#include 

void f(int *t)
{
for(int i=0;i<sizeof t;i++)
cout<<t[i]<<endl;
}

void main()
{
int t[2][2]={{1,25},{2,50}};
f((int*)t);
}



> affiche
1
25
2
50
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 janv. 2004 à 19:35
merci pour tes réponses, c'est effecivement ce que je comptatit faire quand je disais que je voulais passer t[0] qui est bien un int*
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
15 janv. 2004 à 23:03
c'est assez dangereux de faire ca

ce que je ne comrend pas, c'est pourquoi tu ne fait pas ca :

int t[2][2];

f((int**)t);

sinon tu disais que tu ne savais pas cb de case tu avais dans ton tableau et que tu utilisais n, or, int t[n] le compilo te pete une erreur, et par consequent si tu utilise n, tu doit malloquer, et si tu malloc, tu doit utiliser un int **, et donc cela ne pose pu de prob avec ton prototype void f(int **t);

enfin sinon c'est que j'ai pas tout bien tout compris
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 janv. 2004 à 23:43
c'est ca tu n'as pas bien compris
- f((int**)t) ne marche pas lors de l'éxécution, ca je l'ai écrit des le début
- n est utilisé dans la f pour lui dire la taille du tableau et non pas pour créer ce tableau
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 janv. 2004 à 23:44
et puis je vois pas ce qui est dangereux
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
16 janv. 2004 à 00:35
ce qui est dangereux :

#include

void f(int *t)
{
for(int i=0;i<sizeof t;i++)
cout<<t[i]<<endl;

// ici t[i] est un int* (en dehors du context du prototype
// car dans le main, il a beau caster en int*, le tableau
// reste un tableau, donc un int**

}

void main()
{
int t[2][2]={{1,25},{2,50}};
f((int*)t);
}

en fait ca fonctionne parceque int t[2][2] le compilo organise les cellules des tableaux de maniere adjacentes dans la memoire, le jour ou cela ne sera plus vrai, ca fonctionnera pu
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
16 janv. 2004 à 00:39
aussi, i < sizeof(t) est valide parceque t est un simple pointeur (dans la fonction f) donc sizeof(t) == 4 et que t[2][2] == 4 octets aussi (dans le main), mais voyons la chose differement:

t[10][10] sizeof(t) == 100 (dans le main) et sizeof(t) est toujours egale a 4 (dans la fonction f) parceque int* est toujours un pointeur

sizeof ne se soucie pas de savoir sur quoi il pointe, il se soucie juste de savoir que c'est un pointeur, et qu'un pointeur est codé sur 4 octets
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
16 janv. 2004 à 06:01
ouai je me suis planté, d'ailleur si ca avait etet un tableau j'aurai du faire sizeof t/sizeof t[0] mais de toute facon comme tu dit c'etait un pointeur on perd l'information sur la taille
0
Rejoignez-nous