Expandir matriz dinámica?

Iniciado por Metal-byte, 22 Enero 2012, 15:11 PM

0 Miembros y 1 Visitante están viendo este tema.

Metal-byte

El asunto es este. Estoy creando una matriz dinámica de 3 de ancho (fijo) por n filas de alto con la función calloc.

Mi consulta es como quitarle o agregarle filas a esa matriz en tiempo de ejecución. Tengo entendido que puedo hacerlo mediante la función realloc, pero no entiendo como funcionaría en este caso (La he probado solo en arrays dinámicos, pero nunca en matrices :/)

Saludos.

Akai

Imagino que la matriz dinámica la crearás de un modo similar a:

int **matriz

matriz=(int **) calloc(num_filas,sizeof(int*));

for(i=0;i<num_filas;i++){
    matriz[i]=(int *) calloc(3,sizeof(int));



Para modificar el numero de filas:



matriz= (int **) realloc(matriz,num_fila_nuevo*sizeof(int*));

if(num_fila_nuevo> num_fila){ //tendremos que añadir columnas si hemos ampliado el numero de filas

    for(i=num_fila;i<num_fila_nuevo;i++){
        matriz[i]=(int *) calloc(3,sizeof(int));
    }

}
num_fila=num_fila_nuevo



rir3760

Cita de: Metal-byte en 22 Enero 2012, 15:11 PMMi consulta es como quitarle o agregarle filas a esa matriz en tiempo de ejecución. Tengo entendido que puedo hacerlo mediante la función realloc, pero no entiendo como funcionaría en este caso (La he probado solo en arrays dinámicos, pero nunca en matrices :/)
Si se reserva la memoria en la forma usual solo tienes que seguir la explicación de Akai teniendo cuidado de, si el numero de filas se reduce, primero liberar esas filas.

Si como indicas el numero de columnas por fila es fijo puedes utilizar un puntero a array y reservar todo el bloque mediante malloc/realloc sin tener que preocuparte por reservas individuales.

Un programa de ejemplo en C sobre esto ultimo (sin validación de errores para acortar):
#include <stdio.h>
#include <stdlib.h>

#define NUM_FILAS  6
#define NUM_COLS   3

int main(void)
{
   int (*p)[NUM_COLS];
   int num_filas = NUM_FILAS;
   int i;
   int j;
   
   /* Reserva y asignacion */
   p = malloc(num_filas * sizeof *p);
   for (i = 0; i < num_filas; i++)
      for (j = 0; j < NUM_COLS; j++)
         p[i][j] = 10 * i + j;
   
   /* Impresion */
   for (i = 0; i < num_filas; i++){
      for (j = 0; j < NUM_COLS; j++)
         printf("%3d", p[i][j]);
     
      putchar('\n');
   }
   
   puts("---------");
   
   /* Reajuste (Capacidad a la mitad) */
   num_filas /= 2;
   p = realloc(p, num_filas * sizeof *p);
   
   /* Impresion */
   for (i = 0; i < num_filas; i++){
      for (j = 0; j < NUM_COLS; j++)
         printf("%3d", p[i][j]);
     
      putchar('\n');
   }
   
   free(p);
   
   return EXIT_SUCCESS;
}


Un detalle: si la función realloc falla esta retorna NULL y el puntero pasado como primer argumento continua siendo valido. Hay que considerar eso cuando se agrega validación de errores.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language