Fonction tableau 2 dimensions

Signaler
Messages postés
6
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
24 décembre 2004
-
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
-
Bonjour,

J'aimerai savoir comment on fait pour passer un tableau a deux dimensions en parametre dans une fonction en passant par son adresse. J'arrive a le faire pour une dimension mais pour deux ca ne marche plus. Voila le code pour une dimension:

void afficher(int *pTab){
printf("%d", pTab[0]);
};

main(){
int Tab[5]={1,2,3,4,5};

afficher(Tab);
}

16 réponses

Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
et si tu nous envoyais le code pour ton tableau a 2 dimension ?
Parce que la, ca nous sert a rien....
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
escuse moi g lu trop vite mais desolé je ne dais pas comment faire...ni si c'est possible...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Tu mets deux **. Genre :

TYPE-RETOUR FONCTION_NAME(TYPE **tontableau);

Il me semble que c'est ca. La meme déclaration que pour des tableaux de pointeurs.
Messages postés
6
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
24 décembre 2004

Oui c'est ce que j'ai cru comprendre mais ca ne marche pas. Regarde, je me ca dans mon code :

void afficher(int **ppTab){
printf("%d ", ppTab[0][0]);
}

main(){
int tab[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
afficher(tab);

}

Et donc logiquement ca devrait fonctionner! A moins que quelquechose m'echappe!!!
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
pour passer un tableau à 2 dimension, il faut que la taille de la deuxième soit connu à la compilation (seule la première peut être omise):

void afficher(int Tab[][5]){
printf("%d ", Tab[0][0]);
}

main(){
int tab[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
afficher(tab);
}

pour passer un tableau de taille quelconque, ca se complique, selon que c'est un tableau dynamique ou statique, mais dans les 2 cas il faut spécfier les tailles des dimensions
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

oui, ça ne marche pas pour les tableaux multidimensionnels, il faut faire quelqueclose comme ceci :
#include <stdio.h>
void afficher(int *ppTab){
printf("%d ", ppTab[1*5+2]);
}

int main(){
int tab[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
afficher(&tab[0][0]);

}
Messages postés
6
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
24 décembre 2004

La solution de ymca2003 marche tres bien.
Je vais prendre celle la car elle est plus jolie ;-)

MERCI beaucoup

++
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

les 2 solutions sont a peu pres equivalentes, elles s'appuient sur la connaissance de la seconde dimension.
Messages postés
6
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
24 décembre 2004

non non ce n'est pas pareil pke en fait un tableau a deux dimensions est un tableau de sous tableau.
Toi tu passe en parametre l'adresse du premier sous tableau en fait donc ce n'est pas rigoureux. Comprends-tu?
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

lol !
c'est rigoureux.
En passant en parametre dimension(s) et indices, c'est plus général puisque la dimension du tableau ne dépend pas de la déclaration de la fonction.
Messages postés
6
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
24 décembre 2004

OK bah je vais essayer alors mais j'avais deja essayer quelquechose dans le genre mais ca ne marchais pas quand dans la fonction je mettais printf("%d", ppTab[0][0]);
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Une autre version pour le fun, tu peux remettre tes printf si tu le veux.

#include // en c++ on utilise les entetes adequates
using namespace std;

template< int n >
inline void afficher( int ppTab[][n] )
{
cout << ppTab[0][0]; // cout plutot que printf
}

int main()
{
int tab25[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
afficher( tab25 ); // &tab[0][0] revient à tab tout court
int tab18[1][8]={{1,2,3,4,5,6,7,8}};
afficher( tab18 ); // &tab[0][0] revient à tab tout court
}

Cordialement,
Xterminhate.
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

en C++, on devrait utiliser (généralement) vector, mais pour rester dans le sujet du topic, et pour le fun aussi :

#include
using namespace std;

// size_t pour les tableaux intégrés, sinon T::size_type
template <class T>
void afficher(const T& tab,size_t i,size_t j)
{
cout << tab[i][j] << endl;
}

int main()
{
int tab25[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
afficher(tab25,1,3);
int tab18[1][8]={{1,2,3,4,5,6,7,8}};
afficher(tab18,0,6);
}
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
bizarrement le tab[0][0] ne reviens pas a tab tout court le compilateur (gcc 3.3.1) me dit :

cannot convert `int (*)[2][5]' to `int*' for argument `1' to `void afficher(int*)'

lorsque je remplace tab[0][0] par tab dans le code de plus_plus_fab:

#include <stdio.h>
void afficher(int *ppTab){
printf("%d ", ppTab[1*5+2]);
}

int main(){
int tab[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
afficher(&tab);

}
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

On a dit : &tab[0][0] équivalant à tab tout court. Ce n'est pas ce que tu as écrit.

Cordialement,
Xterminhate.
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
oui en effet merci.... mais ca ne marche toujours pas chez moi...