2012-01-17 4 views
0

J'ai besoin de créer une fonction qui a un paramètre qui est un tableau multidimensionnel avec deux dimensions étant spécifiées par l'utilisateur, par ex.Tableau multidimensionnel

int function(int a, int b, int array[a][b]) 
{ 
... 
} 

Comment ferais-je cela en C++?

+3

Alors, quelle est votre question? –

+7

Les gars, cette question a 6 minutes. Le questionneur est nouveau sur le site. Pensez à lui donner un peu plus de temps pour le réparer avant de l'abaisser/de le fermer dans l'oubli. –

+3

J'ai ranger la question et j'ai voté pour rouvrir –

Répondre

2

Les dimensions sont-elles connues à la compilation? Dans ce cas, les transformer en paramètres de modèle et passer le tableau par référence:

template<int a, int b> 
int function(int(&array)[a][b]) 
{ 
    ... 
} 

Exemple code client:

int x[3][7]; 
function(x); 

int y[6][2]; 
function(y); 
1

En supposant que les dimensions ne sont pas connues au moment de la compilation, vous imitez deux une matrice bidimensionnelle avec une matrice bidimensionnelle:

int& getat(int x, int y, int r, int c, int *array) {return array[y*c+x];} 
int function(int a, int b, int *array) { 
    getat(4, 2, a, b, array) = 32; //array[4,2] = 32 
} 

ou, pour plus de sécurité, envelopper le tout dans une classe:

template <class T> 
class array2d { 
    std::vector<T> data; 
    unsigned cols, rows; 
public: 
    array2d() : data(), cols(0), rows(0) {} 
    array2d(unsigned c, unsigned r) : data(c*r), cols(c), rows(r) {} 
    T& operator()(unsigned c, unsigned r) { 
     assert(c<cols&&r<rows); 
     return data[r*cols+c]; 
    } 
}; 

ou, mieux encore, utilisez Boost's Multidimensional Array, ce qui sera mieux que tout ce que les simples mortels pourraient écrire.

0

Je ne sais pas si ce travail, parce que votre question et le code ne sont pas les mêmes, en fonction de votre code, la fonction peut avoir 3 paramètres, donc cela pourrait fonctionner:

int function(int a, int b, int** &array) 
{ 
    array = new int*[a]; 
    for (int i =0;i<a;i++) 
     array[i] = new int[b]; 

    // I don't know why you are returning int, probably doing something here.... 
} 

Toutefois, votre question dit que votre fonction peut prendre un seul paramètre, donc:

  1. si les dimensions sont connues au moment de la compilation, puis Fred's Answer est le meilleur (il me charmait en fait :)!).
  2. sinon, je ne vois aucune solution possible qui permette de passer plus d'une valeur spécifiée par l'utilisateur autre que d'encapsuler toutes ces valeurs dans un objet.

Comme ceci:

class Foo { 
public: 
    Foo(int d1, int d2) 
    { a = d1; b = d2; } 
    int a,b; 
    int** array; 
}; 

int function(Foo &f) 
{ 
    f.array = new int*[f.a]; 
    for (int i = 0;i<f.a;i++) 
     f.array[i] = new int[f.b]; 
    // I don't know why you are returning int, probably doing something here.... 
} 

Bien que je trouve une mauvaise idée, en fait, le function pourrait être une méthode parameterless à la place:

class Foo { 
public: 
    Foo(int d1, int d2) 
    { a = d1; b = d2; } 

    void Create() // Or could do this right in the Constructor 
    { 
     array = new int*[a]; 
     for (int i = 0;i<a;i++) 
      array[i] = new int[b]; 
    } 

private: 
    int a,b; 
    int** array; 

}; 

encore c'est une mauvaise idée, parce que vous réinventez la roue, car il y a une classe parfaite dans la STL pour faire tout le travail pour vous:

vector< vector<int> > v; // Now v is a 2D array