Votre question

comment passer un tableau 2D en argument C++?

Tags :
  • 2D
  • arg
  • argument
  • C++
  • tableau
Dernière réponse : dans Programmation
25 Mai 2013 14:33:45

bon voila

ça fait un bon moment que je cherche a accder a un tableau dans une fonction sans succès (accesseurs, argument, variable globale...)
existe un moyen simple et efficace de pouvoir utiliser un tableau d'une autre classe dans une fonction?
Merci de vos réponses!

Autres pages sur : passer tableau argument

25 Mai 2013 23:21:03

Bonjour,

Je vais tenter de dresser un portrait de la situation mais tu vas vite voir que C++ est un langage (très complexe) qui n'aime pas trop les tableaux C, qui sont du coup difficiles à manipuler surtout quand ils ont plusieurs dimensions.
De base C++ "dégrade" le type tableau (à une dimension) qu'on lui passe pour en faire un pointeur (ce comportement vient du C).
On peut donc écrire ce genre de chose :
  1. int* getArray(int array[]) { // array est dégradé en int*
  2. return array;
  3. }


Note que je suis censé retourner un int* et que visiblement mon return array; ne pose pas de problème. C'est pour ça que je parle de dégradation, en fait c'est une autre écriture pour :
  1. int* getArray(int* array) {
  2. return array;
  3. }


mais ce n'est pas un "vrai" passage de tableau en argument qu'on fait là si je puis dire. D'ailleurs si on veut passer un tableau d'int à 2 dimensions en paramètre, on ne peut pas écrire :
  1. void foobar(int array[][]) { ... } // declaration of ‘array’ as multidimensional array must have bounds for all dimensions except the first

Spoiler
le message d'erreur nous indique qu'une chose comme "void foobar(int array[][37]) { ... }" marcherait soit dit en passant) ^^ .

De même si on veut retourner un tableau de ce genre, on ne peut pas écrire des trucs du genre :
  1. int[][] getArray() { ... } // error: expected unqualified-id before ‘[’ token


Comment on fait alors ? Ben c'est compliqué :/ 
C'est pour ça que la plupart du temps :

  • soit les gens utilisent les collections de la stl comment std::vector<int>, qui sont les tableaux de C++ (par opposition à int[] qui sont les tableaux de C)
  • soit ils abandonnent l'idée d'utiliser "proprement" les types tableaux C et se rabattent sur des pointeurs ou des pointeurs de pointeurs. Mais comme type de retour pour une méthode publique d'une classe c'est franchement pas top. Quand on utilise ce genre de raccourcis il faut que ça reste en private mais il faut éviter d'exposer ce genre de cuisine interne publiquement.

  • http://h-deb.clg.qc.ca/Sujets/Divers--cplusplus/CPP--Ta...
    27 Mai 2013 21:52:52

    Oui pour les tableaux à plusieurs dimensions, on peut se passer de la taille seulement sur 1 dimension. Tout est rectiligne en mémoire, donc les lignes se suivent. C'est pour ça que le compilateur doit avoir un certain nombre de tailles pour retrouver les adresses des éléments à partir les indices.
    Bref, dans tous les cas, il faut connaitre la taille du tableau, alors autant le gérer avec une taille fixe (et on peut faire passer un pointeur de tableau sans problème..

    Une autre alternative serait de faire un tableau de pointeurs : le tableau se transforme en liste de lignes, et on y accède de la même manière en C bien que le code compilé soit différent.
    Tom's guide dans le monde
    • Allemagne
    • Italie
    • Irlande
    • Royaume Uni
    • Etats Unis
    Suivre Tom's Guide
    Inscrivez-vous à la Newsletter
    • ajouter à twitter
    • ajouter à facebook
    • ajouter un flux RSS