2016-03-09 2 views
-2

Как вы знаете, многомерный массив должен иметь границы для всех измерений, кроме первого, когда мы определяем это перед main. У меня есть матрица 2d и вы хотите использовать ее как аргумент функции. Эта 2d матрица имеет строку и столбец, и я должен инициализировать столбец ... Я знаю эти способы: (. И не хочу использовать командную строку для определения значения столбца)Использование двумерного массива в качестве аргумента функции в (C++)?

//1-using a number 
void sample(int array[][5]); 
int main(){.....} 

или

//2-using a static parameter 
#define x 5 
void sample(int array[][x]); 
int main(){.....} 

Но не из них полезно 4 меня, у вас есть какие-либо другие предложения?

На самом деле это мой основной код:

#define colu 7 
#define colu_ 7 

int compute(char mat1[][colu],int r1,char mat2[][colu_], int r2); 
int main(){ 
. 
. 
. 
int m; 
m=compute(mat1,r1,mat2,r2); 
cout<<m<<endl; 
return 0;} 

//**************** 
int compute(char mat1[][colu],int r1,char mat2[][colu_], int r2){ 
... 
} 
//**************** 

мне нужно прохождение этих 2d матриц в функции «вычислительном».

+3

Можете ли вы более подробно рассказать о том, что вы пытаетесь выполнить, вместе с кодом, чтобы пойти с ним? – dbush

+0

Да, я добавлю его на вопрос только сейчас ... – shirin

+3

C или C++? Выбери один. –

ответ

1

Вы можете использовать шаблоны либо автоматически, либо непосредственно определить размеры столбцов:

template <size_t col1, size_t col2> 
int compute(char mat1[][col1], int r1, char mat2[][col2], int r2) 
{ 
    std::cout << "c1: mat 1 is " << r1 << "x" << col1 << "\n"; 
    std::cout << "c1: mat 2 is " << r2 << "x" << col1 << std::endl; 

    return r1; 
} 

Если размеры матрицы известны во время компиляции вы можете использовать его так же, как это:

int main() { 

    char mat1[1][1] = { { 'a' } }; 
    char mat2[2][2] = { { 'b', 'c' },{ 'd', 'e'} }; 
    compute(mat1, 1, mat2, 2); 
    compute(mat1, 1, mat2, 1); 
    return 0; 
} 

Однако, если вам нужно работать с char**, эта реализация не очень полезна ...

+0

Спасибо за помощь! вы хорошо меня ведете! он работает :) – shirin

1

Если вы не хотите использовать параметры, которые вы всегда можете использовать вектор вектора:

void sample(vector<vector<int>>& array) 

И тогда вы можете получить соответствующий размер с:

array.size(); 
array[0].size(); // if at least there is a row 

отметить также, что, как изложенные в комментариях, использование вектора вектора - это не то же самое, что Матрица, поскольку строка может иметь размер differnets.

Другой варианта иметь один вектор и используя некоторую математику, чтобы получить доступ к конкретной строке Col:

double matrix::get(size_t x1, size_t y1) 
{ 
    return m[ x1 * x + y1 ]; 
} 
+0

Помните, что это может закончиться строками разных размеров, поэтому не обязательно должна быть 2d-матрица, поэтому, хотя я бы определенно пошел на 'vector', я бы рекомендовал использовать только один вектор (размер: x * y), завернутый в простой класс доступа –

+0

Немного нравится [это] (http://stackoverflow.com/questions/29693700/c-2d-vector-got-error/29694032#29694032) возможно –

+0

Спасибо, да, я знаю этот подход. Это будет моя последняя попытка ... Я предпочитаю использовать 2d-массив вместо преобразования его в вектор. Но спасибо за ваше предложение – shirin

1

Если вы можете использовать C99, использовать VLA.

void sample(int rows, int cols, int array[rows][cols]); 

В C++ использовать std::vector<std::vector<int>> вместо 2D массива.

void sample(std::vector<std::vector<int>> const& array); 
+0

Я использовал это: void sample (int rows, int cols, int array [rows] [cols]); но получите ошибку, в которой говорится: «использование внешнего тела функции« cols » « – shirin

+0

@shirin, он отлично подходит для меня, используя 'gcc -std = c99'. Какие параметры компилятора и компилятора вы используете? –

1

Если размеры массива известны во время компиляции, вы можете использовать шаблон:

template<int X, int Y> 
void foo(int (&array)[X][Y]) { 
    std::cout << X << ' ' << Y << '\n'; 
    for(const auto& arr : array) { 
     for(const auto& i : arr) { 
      std::cout << i << ' '; 
     } 
     std::cout << '\n'; 
    } 
} 

int main() { 
    int asdf[2][5] = { 
     { 1, 2, 3, 4, 5 }, 
     { 6, 7, 8, 9, 10 } 
    }; 
    foo(asdf); 
} 

Это не будет работать, если вы динамически выделять ваш массив с new хотя.

+0

Большое спасибо, используя идею шаблона, поскольку вы и Саймон сказали, что это хороший момент для меня :) – shirin

Смежные вопросы