C/Visual C - memoria dinamica

 
Vista:

memoria dinamica

Publicado por El LoCo (5 intervenciones) el 27/07/2002 18:52:38
Hola!
Tengo un problema cuando quiero trabajar con matrices.
Si pido la memoria asi:
matriz=(double**) malloc (fila * columna * sizeof(double));
no me permite hacer:
scanf (\"%lf\",matriz[i][j]); /*por ejemplo*/

Y si pido la memoria:
int i;
if((fila=(double **)malloc(f * sizeof(double *)))==NULL)
return ERROR;
for (i=0; i<f; i++)
if ((*(fila+i)=(double *)malloc(c * sizeof(double)))==NULL) {
printf (\"Memoria insuficiente\\n\");
free (fila);
fila=NULL;
return ERROR;
}
return OK;

Funciona todo bien, pero tengo problemas para liberar toda la memoria pedida, ya que primero pedi una columna del largo de la fila, y luego pedi varias filas de tamaño columna, y utilice la primera para guardar punteros.
Si alguien me puede ayudar, se los agradezco.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:memoria dinamica

Publicado por Oliver Ramirez (12 intervenciones) el 28/07/2002 06:40:38
Tengo la solucion pero para c++ y es de la siguiete manera:

double matriz = new double[ filas * columnas ];

y para acceder a los datos
matriz[ filas * numero_de_columnas + columnas];

numero_de_columnas es una variable fija que contiene el numero de las columnas que tiene la matriz.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:memoria dinamica

Publicado por EL LoCo (5 intervenciones) el 28/07/2002 07:49:50
Voy a ver si me sirve....
Yo lo tengo que hacer en C, si o si...
Pero voy a probar si lo puedo adaptar.
Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:memoria dinamica

Publicado por chuidiang (677 intervenciones) el 28/07/2002 10:18:19
Puedes hacer como te dijo Oliver Ramirez pero en C. Es lo mismo, en vez de new pones malloc.

Si quieres también puedes hacer lo del doble malloc, aunque es un poco más liado.

double **vector = NULL;

vector = (double **)malloc (numero_filas * sizeof(double *));

for (int i=0; i<numero_filas; i++)
{
vector[i] = (double *)malloc (numero_columnas * sizeof(double));
}

Para liberar, tienes que hacer igual, pero al revés. Primero el bucle con los free(vector[i]) y finalmente, fuera del bucle, el free(vector);

La solución de Oliver es más simple en cuanto a reserva de memoria, pero menos "comprensible" en cuanto al uso de índices. Esta solución es más liada con la memoria, pero luego puedes usar vector[i][j].

Tanto con una como con otra, te resultaría útil hacerte funciones que te faciliten todo. Por ejemplo, en la de Oliver podrías poner una función
double Dame_Elemento (double **, int fila, int columna);
y en la que yo te propongo una como
double **Dame_Matriz (int numero_filas, int numero_columnas) y
void Libera_Matriz (double **vector, int numero_filas):

Sé bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar