2012-04-15 9 views
5

Quiero hacer una biblioteca de clases, una función cuyo parámetro es una matriz de tamaño desconocido, y el usuario creará su propia matriz con su propio tamaño y la pasará a esta función para hacer algunas operaciones en su matriz de este tipo, será la funciónCómo pasar una matriz bidimensional de un tamaño desconocido a una función

calculateDeterminantOfTheMatrix(int matrix[][]) 
{ 
    some Operations to do on matrix 
} 
+0

int ** matrix sería la sintaxis que está buscando. –

+1

Si va a hacer que las personas pasen una matriz de tamaño arbitrario, haga que también pasen el número de filas y columnas. O, como alternativa, utilice 'std :: vector >' – birryree

+2

@SteveHoward Una matriz 2D no se descompone en puntero a un puntero en C++. – Mahesh

Respuesta

12

matrices multidimensionales no son muy bien soportado por los componentes integrados de C y C++. Puede pasar una matriz N -Dimension sólo cuando sepa N-1 dimensiones en tiempo de compilación:

calculateDeterminantOfTheMatrix(int matrix[][123]) 

Sin embargo, los suministros de biblioteca estándar std::vector de contenedores, que funciona muy bien para las matrices multidimensionales: en su caso, pasando vector<vector<int> > &matrix sería la forma correcta de tratar con la tarea en C++.

int calculateDeterminantOfTheMatrix(vector<vector<int> > &matrix) { 
    int res = 0; 
    for (int i = 0 ; i != matrix.size() ; i++) 
     for(int j = 0 ; j != matrix[i].size() ; j++) 
      res += matrix[i][j]; 
    return res; 
} 

Como una ventaja añadida, que no tendría que pasar dimensiones de la matriz a la función: matrix.size() representa la primera dimensión, y matrix[0].size() representa la segunda dimensión.

+0

en caso i declaran que 'calculateDeterminantOfTheMatrix (vector > & matriz)' será i ser capaz de bucle en él como esto 'para (matriz [rowNumber] [ColumnNumber]' –

+0

@AhmedZainElDein I añadió un ejemplo de bucle sobre los elementos de la matriz en caso de que pase en un 'vector >'. – dasblinkenlight

+0

¿funciona 'int ** matrix' aquí o no? –

1

Existen varios enfoques que puede tomar.

  1. C manera de hacer las cosas -> Pasar en un int** pero ser extremadamente cuidadoso aquí. Esto no es todo un conjunto 2D. Tendrá que asignar correctamente la memoria a este puntero, o, como alternativa, debe saber el tamaño en el momento de la compilación. (Por ejemplo, asignar estáticamente una matriz de tamaño M * N y luego no permitir nada más grande). Para asignar dinámicamente la memoria, necesita saber la cantidad de filas y columnas.

  2. C++ manera ->#include <vector> después de lo cual puede simplemente usar vector<vector<int> > &matrix (. Cuidado con el espacio después de la <int> a menos que estés usando C++ 11 compilador), que destinará un vector de vectores int que es básicamente una 2d matriz. La gestión de la memoria se ocupará de usted en este caso.

+0

La forma C de hacer las cosas también se complica cuando se tiene en cuenta que la matriz bidimensional se puede almacenar en filas o en columnas. – mdenton8

1

Escribo un envoltorio de clase simple para la matriz con la columna y la fila definidas.

template <typename T> 
class Mat { 
    std::size_t _row; 
    std::size_t _col; 

    T *_mat_elem; 
public: 
    Mat(std::size_t r, std::size_t c) 
    : _row(r), _col(c), _mat_elem(new T[r*c] {} 
    ~Mat() {/* remember to do delete [] here */} 

    // element access, for example 
    T& at(std::size_t r, std::size_t c) 
    { 
    return *(_mat_elem+r*_col+c); 
    } 
}; 

Pero en realidad está reinventando las ruedas. Hay buenas bibliotecas para el manejo de matrices por ahí.

+0

Esta es una respuesta mucho mejor que las otras dos. – mdenton8

2

solución C:

En C no se puede omitir tamaño de la matriz (excepto más a la izquierda) cuando se pasa como parámetro de la función.

Se puede escribir: int a []

pero no puede: int a [] []

sólo por ejemplo: int a [] [20]

Este la restricción está aquí, porque el compilador necesita determinar los desplazamientos adecuados para acceder a los elementos de la matriz. Sin embargo, puede hacerlo de esta manera:

void print_arbitrary_2D_array(void *arr, int y, int x) 
{ 
    /* cast to 2D array type */ 
    double (*p_arr)[y][x] = (double (*)[y][x]) arr; 

    int i, j; 

    for (i = 0; i < y; ++i) { 
     for (j = 0; j < x; ++j) 
      printf(" %lf", (*p_arr)[i][j]); 
     putchar('\n'); 
    } 
} 

double arr_1[4][3] = { 
    { 3.3, 5.8, 2.3 }, 
    { 9.1, 3.2, 6.1 }, 
    { 1.2, 7.9, 9.4 }, 
    { 0.2, 9.5, 2.4 } 
}; 
double arr_2[2][5] = { 
    { 3.6, 1.4, 6.7, 0.1, 4.2 }, 
    { 8.4, 2.3, 5.9, 1.4, 8.3 } 
}; 

print_arbitrary_2D_array(arr_1, 4, 3); 
putchar('\n'); 
print_arbitrary_2D_array(arr_2, 2, 5); 
Cuestiones relacionadas