2012-01-17 2 views
0

Мне нужно создать функцию, которая имеет параметр, который представляет собой многомерный массив с двумя измерениями, заданными пользователем, например.Многомерный массив

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

Как бы это сделать на C++?

+3

Итак, каков ваш вопрос? –

+7

Ребята, этот вопрос составляет 6 минут. Вопроситель является новым на сайте. Пожалуйста, подумайте о том, чтобы дать ему немного времени, чтобы исправить это до того, как он запустил/закрыл его в забвение. –

+3

Я прибрал вопрос и проголосовал за повторное открытие –

ответ

2

Являются ли размеры известными во время компиляции? В этом случае, превратить их в параметры шаблона и передать массив по ссылке:

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

Пример кода клиента:

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

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

Предполагая, что размеры не известны во время компиляции, вы эмулировать два одномерный массив с одномерным массивом:

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 
} 

или, в целях безопасности, завернуть все это в классе:

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]; 
    } 
}; 

или, что еще лучше, используйте Boost's Multidimensional Array, что будет лучше, чем все, что могли написать простые смертные.

0

Я не уверен, если эта работа, потому что ваш вопрос и код не то же самое, в соответствии с вашим кодом функция может иметь 3 параметра, так что это будет работать:

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.... 
} 

Однако ваш вопрос говорит что ваша функция может принимать только один параметр, так:

  1. если размеры известны во время компиляции, то Fred's Answer является лучшим (он очаровал меня на самом деле! :)).
  2. Если нет, я не вижу никакого возможного решения, которое позволяет передавать более одного заданного пользователем значения, кроме инкапсуляции всех этих значений в один объект.

Как это:

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.... 
} 

Хотя я считаю, это плохая идея, ведь function может быть метод без параметров вместо:

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; 

}; 

Тем не менее, это плохая идея, потому что вы изобретаете колесо, так как в STL есть идеальный класс, чтобы выполнить всю работу за вас:

vector< vector<int> > v; // Now v is a 2D array 
Смежные вопросы