salut,
est ce qu'il y a une méthode pour passer un tableaux à deux dimensions en paramétre d'une fonction sans spécifié les dimensions ???:cry:
merci d'avance
Version imprimable
salut,
est ce qu'il y a une méthode pour passer un tableaux à deux dimensions en paramétre d'une fonction sans spécifié les dimensions ???:cry:
merci d'avance
Avec une fonction template oui, ça ne pose aucun problème.
Salut,
Si, par "tableau deux dimensions" tu entend "tableau C style deux dimensions", oui, effectivement, c'est faisable.
Cela se fait en passant un pointeur de pointeur sur le type contenu dans ton tableau.
Cependant, il s'agira de fournir deux informations supplémentaires à la fonction: la taille de chacune des dimensions envisagée.
Au final, ta fonction pourrait ressembler à (adaptée ici à l'utilisation d'un tableau deux dimensions contenant des entiers)
Ceci dit, il est très facile de remplacer un tableau à deux dimensions par un tableau à une seule: créer un tableau de dimension unique composé de lignes * colonnes éléments.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 /* fonction qui travaille sur un tableau d'entiers à deux dimensions * \in : int ** tab2D : pointeur sur le tableau en question * size_t col : nombre de colonnes du tableau * size_t row : nombre de lignes du tableau */ void fonction(int **tab2D, size_t col, size_t row) { for(size_t ligne = 0;ligne<row;++i) { for(size_t colonne = 0; colonne < col; ++i) { cout<<tab2D[ligne][colonne]<" "; } cout<< endl; } }
Plutôt que d'accéder au tableau sous la forme de tab[ligne][colonne], on y accède sous la forme de tab[ligne*colonne_max + colonne] ;)
L'avantage, c'est que l'on ne doit pas commencer à jouer avec des pointeurs de pointeurs quand il s'agit de passer ce tableau comme paramètre à des fonctions ;)
Enfin, il est aussi possible d'utiliser la classe qui fournit tous les comportement d'un tableau: la classe vector, disponible dans l'espace de noms std par inclusion du fichier d'en-tête <vector>.
Tu Le raisonnement précédent (celui de considérer ton tableau comme contenant lignes * colonnes élément) est toujours envisageable, mais tu peux aussi envisager de créer un vecteur de... vecteurs du type à contenir sous une forme proche (pour des entiers ici) de
mais cette manière de faire est souvent plus "ardue" à mettre en oeuvre ;)Code:std::vector<std::vector<int> > tab2D;//remarque l'espace entre les deux >
[EDIT]Et j'ai failli oublié: il existe certaines bibliothèques qui fournissent des classes "matrice", qui pourraient également remplacer assez avantageusement les tableaux à deux dimensions ;)
salut,
oui ,c'est bien ça ce que je cherche. Manipuler des matrices (les passées en parmétres à des fonctions...)
tu peux m'expliquer de plus sur ces matrices ou même me donné un lien??
merci pour les réponses
Matrice au sens mathématique de la chose ou au sens tableau 2 dimensions ?
1er : boost::ublas
2eme: boost::multi_array.
koala1, un pointeur vers un pointeur n'a rien à voir avec un tableau de tableaux.
Voici donc la solution dont j'ai parlé
La fonction générique foo prend donc n'importe quel tableau de tableaux de n'importe quel type, avec tailles détectées automatiquement.Code:
1
2
3
4 template<typename T, std::size_t N, std::size_t M> void foo(T (&tab)[N][M]) { }
Dans l'absolu, ne ne dis pas... mais dans la triste réalité, il n'est pas rare de constater un code proche de
lorsque les gens veulent implémenter un tableau à deux dimensions ;)...Code:
1
2
3
4
5
6
7
8
9 letype ** mat; mat = new letype[nombre_ligne]; for(int i=0; i<nombre_llgne;++i) { mat[i]= new letype[nombre_colonne]; for(int j=0;j<nombre_colonne;++j) { mat[i][j] = blabla (avec la logique permettant de donner une valeur cohérente) ; }
Dés lors, il semble cohérent de transmettre ce genre de tableau sous la forme de pointeurs de pointeurs ;)
En outre, je ne nie pas l'utilité des fonctions template, mais, encore une fois, il reste malgré tout *relativement* rare qu'une personne qui pose une question aussi "basique" (soit dit sans offence à l'adresse de afnane) n'ait besoin de manipuler des quantités énorme de tableaux deux dimensions dont les objets sont de types différents ;)