Memoria dinámica y matrices. Ayuda please!!
Tengo un par de dudas que necesitaría que me resolvieran:
Primero, ¿cómo crear una matriz dinámicamente dando el usuario las dimensiones?
Y ¿cómo pasar como parámetro una matriz bidimensional?
Gracias
Primero, ¿cómo crear una matriz dinámicamente dando el usuario las dimensiones?
Y ¿cómo pasar como parámetro una matriz bidimensional?
Gracias
Bueno, acá van dos opciones de asignación dinámica usando arrays bidimensionales, en una segunda respuesta te cuento cómo pasar una matriz como parámetro de función...
Hay distintas maneras de asignar memoria dinámicamente para una matriz, dependiendo de las características de la matriz se podrá elegir una u otra. Por ejemplo, si se sabe que la matriz va a ser rectangular, puede asignársele toda una sucesión de direcciones (en "heap"):
int nfilas es la cantidad de filas.
int ncolumnas es la cantidad de columnas.
double* matriz = new double[nfilas * ncolumnas];
/* y para acceder a cada celda por fila y columna: */
for (int i = 0; i < nfilas; ++i) {
for (int j = 0; j < ncolumnas; ++j) {
funcion(matriz[i*ncolumnas + j] );
}
}
/* y luego, para liberar la memoria asignada: */
delete[] matriz;
//---------------------------------------------------------------
Por otro lado, si la matriz no va a ser rectangular (o si no sabemos si lo va a ser o no) porque cada fila puede tener un número de columnas diferente:
int nfilas es la cantidad de filas.
int ncolumnas[] es un array que guarda la cantidad de columnas de cada fila
// espacio para las filas:
double* matriz = new double*[nfilas];
// espacio para las columnas:
// donde ncolumnas[i] es el número de columnas de la fila i
for (int i = 0; i < nfilas; ++i)
matriz[i] = new double[ ncolumnas[i] ];
// y para acceder a cada celda:
for (int i = 0; i < nfilas; ++i) {
for (int j = 0; j < ncolumnas[i]; ++j) {
funcion( matriz[i][j] );
}
}
// y para liberar la memoria asignada a filas y columnas:
for (int i = nfilas; i > 0; --i)
delete[] matriz[i-1]; // primero las columnas
delete[] matriz; // después las filas.
//-----------------------------------------------
Alejandro
Hay distintas maneras de asignar memoria dinámicamente para una matriz, dependiendo de las características de la matriz se podrá elegir una u otra. Por ejemplo, si se sabe que la matriz va a ser rectangular, puede asignársele toda una sucesión de direcciones (en "heap"):
int nfilas es la cantidad de filas.
int ncolumnas es la cantidad de columnas.
double* matriz = new double[nfilas * ncolumnas];
/* y para acceder a cada celda por fila y columna: */
for (int i = 0; i < nfilas; ++i) {
for (int j = 0; j < ncolumnas; ++j) {
funcion(matriz[i*ncolumnas + j] );
}
}
/* y luego, para liberar la memoria asignada: */
delete[] matriz;
//---------------------------------------------------------------
Por otro lado, si la matriz no va a ser rectangular (o si no sabemos si lo va a ser o no) porque cada fila puede tener un número de columnas diferente:
int nfilas es la cantidad de filas.
int ncolumnas[] es un array que guarda la cantidad de columnas de cada fila
// espacio para las filas:
double* matriz = new double*[nfilas];
// espacio para las columnas:
// donde ncolumnas[i] es el número de columnas de la fila i
for (int i = 0; i < nfilas; ++i)
matriz[i] = new double[ ncolumnas[i] ];
// y para acceder a cada celda:
for (int i = 0; i < nfilas; ++i) {
for (int j = 0; j < ncolumnas[i]; ++j) {
funcion( matriz[i][j] );
}
}
// y para liberar la memoria asignada a filas y columnas:
for (int i = nfilas; i > 0; --i)
delete[] matriz[i-1]; // primero las columnas
delete[] matriz; // después las filas.
//-----------------------------------------------
Alejandro
Y pasar una matriz bidimensional como parámetro...
Una matriz multidimensional siempre se pasa como puntero, no se copia.
Acá también depende de lo que sepamos de la matriz.
1) Por ejemplo, si sabemos sus dimensiones en tiempo de compilación:
void mostrar(int m[3][5])
{
for(int i=0; i<3; ++i) {
for(int j=0; j<5; ++j) cout<< m[i][j] << 't';
cout << 'n';
}
}
//-------------------------------------
2) pasando la primera dimensión como argumento:
void mostrar(int m[][5], int dim1)
{
for(int i=0; i<dim1; ++i) {
for(int j=0; j<5; ++j) cout<< m[i][j] << 't';
cout << 'n';
}
}
//--------------------------------------
3) pasando las dos dimensiones:
void mostrar(int* m, int dim1, int dim2)
{
for(int i=0; i<dim1; ++i) {
for(int j=0; j<dim2; ++j) cout<< m[i][j] << 't';
cout << 'n';
}
}
/* fíjate que si la matriz que se va a pasar a mostrar() no es rectangular, como en el caso anterior de la asignación dinámica, habrá que pasar como segunda dimensión el array de columnas de cada fila.*/
// Fine
Alejandro
Una matriz multidimensional siempre se pasa como puntero, no se copia.
Acá también depende de lo que sepamos de la matriz.
1) Por ejemplo, si sabemos sus dimensiones en tiempo de compilación:
void mostrar(int m[3][5])
{
for(int i=0; i<3; ++i) {
for(int j=0; j<5; ++j) cout<< m[i][j] << 't';
cout << 'n';
}
}
//-------------------------------------
2) pasando la primera dimensión como argumento:
void mostrar(int m[][5], int dim1)
{
for(int i=0; i<dim1; ++i) {
for(int j=0; j<5; ++j) cout<< m[i][j] << 't';
cout << 'n';
}
}
//--------------------------------------
3) pasando las dos dimensiones:
void mostrar(int* m, int dim1, int dim2)
{
for(int i=0; i<dim1; ++i) {
for(int j=0; j<dim2; ++j) cout<< m[i][j] << 't';
cout << 'n';
}
}
/* fíjate que si la matriz que se va a pasar a mostrar() no es rectangular, como en el caso anterior de la asignación dinámica, habrá que pasar como segunda dimensión el array de columnas de cada fila.*/
// Fine
Alejandro
