Le passage d'un multidimensionnelle de longueur variable tableau à une fonction

Il ya des tonnes de questions similaires, mais encore je ne pouvais pas trouver une réponse pertinente à la fonction de la longueur variable des tableaux en C99/C11.

Comment passer multidimensionnelle de longueur variable tableau à une fonction dans C99/C11?

Par exemple:

void foo(int n, int arr[][]) //<-- error here, how to fix?
{
}

void bar(int n)
{
    int arr[n][n];
    foo(n, arr);
}

Compilateur (g++-4.7 -std=gnu++11) dit:

error: declaration of ‘arr’ as multidimensional array must have bounds for all dimensions except the first

Si je l'ai changer pour int *arr[], le compilateur se plaint encore:

error: cannot convert ‘int (*)[(((sizetype)(((ssizetype)n) + -1)) + 1)]’ to ‘int**’ for argument ‘2’ to ‘void foo(int, int**)’

Question suivante, comment faire pour passer par valeur et comment le transmettre par référence? Apparemment, habituellement, vous ne voulez pas l'ensemble du tableau à copier lorsque vous passez à une fonction.

Constante avec les tableaux de longueur c'est simple, depuis, que la "constante" qui implique, vous devez connaître la longueur lorsque vous déclarez la fonction:

void foo2(int n, int arr[][10]) //<-- ok
{
}

void bar2()
{
    int arr[10][10];
    foo2(10, arr);
}

Je sais, passage de tableaux à des fonctions comme ce n'est pas une bonne pratique, je ne l'aime pas du tout. Il est probablement mieux de le faire avec des pointeurs plat, ou des objets (comme std:vecteur) ou quelque chose d'autre. Mais encore, je suis un peu curieux de ce qui est ici, la réponse à partir d'un point de vue théorique.

  • Ne pourriez-vous pas utiliser std::vector<std::vector<int>> et d'éviter tous ces problèmes?
  • Blaise ne sont pas en C++11.
  • La réponse à partir d'un point de vue théorique est: "Vous ne pouvez pas". Lors du passage d'un tableau comme paramètre, vous obtenez seulement un "libre" de dimension. Les autres doivent être spécifiés comme des expressions constantes (c'est à dire, des valeurs connues au comple temps).
  • un vecteur de vecteurs vous donne trop de liberté à définir votre dimension (arr[0] peut avoir la taille 3, arr[1] taille 5, et ainsi de suite). Je suppose que Boost.MultiArray est le bon choix.
  • Je suis d'accord. Je l'envelopper dans une sorte de matrice de classe.
  • La Longueur Variable des Tableaux (VLA) est une partie de C99 et a été dans GCC depuis des années. Ils sont toutefois pas pris en charge par MSVC++.
  • Blaise ne sont pas standard C++ soit, ils sont donc mieux éviter.
  • À mon humble avis, c'est assez sûr de dire qu'elle ne sera jamais dans MSVC. Microsoft ne semble pas être vraiment intéressés à soutenir C.
  • Oui, vous avez raison, c'est C99/C11 fonctionnalité
  • Voir le dernier paragraphe

InformationsquelleAutor alveko | 2013-01-27