Lorsqu'un tableau est transmis directement en tant que paramètre à une fonction (valeur de passage), il se désintègre en un pointeur vers le premier élément du tableau. Même si vous pouvez lire clairement dans la signature les dimensions du tableau, ces dimensions sont ignorées par le compilateur. Ce comportement est compatible avec C.
En utilisant C++ vous pouvez transmettre le tableau par référence et ce ne serait plus un problème.
int extract_value(int (&a)[10][10], int row, int col) {
return a[row][col];
}
int main() {
int a[10][10] = {};
a[5][5] = 1;
std::cout << extract_value(a, 5, 5) << std::endl;
int b[5][5];
// extract_value(b, 2, 2); // error: the function takes an array of 10x10
}
Le paramètre function doit correspondre exactement, c'est-à-dire qu'il ne prend qu'un tableau de 10x10 éléments.Vous pouvez supprimer cette restriction en configurant la fonction sur les tailles de tableau. Une fois que vous y êtes aussi le type:
template <typename T, int Rows, int Cols>
T extract_value(T (&a)[Rows][Cols], int row, int col) {
return a[row][col];
}
int main() {
int a[5][7] = {};
extract_value(a, 3, 4);
int b[8][2] = {};
extract_value(b, 7, 1); // correct, the compiler matches sizes
double c[4][4] = {};
extract_value(c, 2, 2); // different types are allowed
}
Cette solution est encore lourde en ce que les dimensions doivent être compiler des constantes de temps, et le tableau doit être alloué stack. La solution consiste à définir une classe qui prend la mémoire dynamique dans un tampon (linéaire) et qui a une conversion du système de coordonnées N dans le tableau à une dimension pour obtenir des valeurs, comme cela a été suggéré précédemment. Vous pouvez obtenir quelques conseils sur la façon de le faire dans ce FAQ sur la surcharge de l'opérateur qui fournit une implémentation d'une matrice 2D. Une fois que vous avez implémenté cela, vous pouvez simplement utiliser cela comme paramètre pour les fonctions/méthodes. Ma recommandation serait de suivre ce dernier chemin: encapsuler le tableau N-dimensional dans une classe qui fournit des conversions dans un vecteur 1D (la FAQ C++ FAQ utilise un pointeur brut, je préfère les conteneurs STL).
J'ai depuis changé les dimensions du tableau en constantes, et je reçois toujours l'erreur. – Mike
Mike, je pense qu'il serait plus utile si vous pouviez publier le code minimal que les erreurs sur le compilateur. Parce que 'int random [25] [80]' semble parfaitement légal. –
coppro, comment votre modèle aide-t-il à modifier les dimensions * lors de l'exécution *? ;-) –