• Sábado 14 de Diciembre de 2024, 22:47

Autor Tema:  Matriz Dinamica  (Leído 2047 veces)

Hobbit

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Matriz Dinamica
« en: Jueves 27 de Mayo de 2004, 22:47 »
0
Hello World.

Como estan todos? Pues eso, estoy haciendo unos ejercicios de calculo numerico, unas rutinas de Schelosky, Jordan Gauss, pero tengo un solo problema, se que es posible crear matrices dinamicas, la pregunta es, Como?

Bueno, si alguien puede aportar alguna ayuda con este problema le estare muy agradecido :beer:

Adios

Bgirl

  • Miembro activo
  • **
  • Mensajes: 62
    • Ver Perfil
Re: Matriz Dinamica
« Respuesta #1 en: Viernes 28 de Mayo de 2004, 03:37 »
0
Matrices dinámicas
Para crear una matriz de elementos de tipo : TIPO_G (tipo genérico) debemos crear en primer lugar, un arreglo de punteros de este tipo de dato.

Para esto , utilizamos un doble puntero para almacenar la dirección del primer elemento del arreglo y a su vez para indireccionar en forma correcta.

TIPO_G **mat = NULL;
Para crear el arreglo de tamaño N, reservamos memoria con la función calloc.

mat =  (TIPO_G **) calloc ( N , sizeof (TIPO_G *) );
Nota : El valor almacenado en mat es un puntero

Ya que cada elemento del arreglo es un puntero de tipo TIPO_G, a cada uno de estos le podemos asociar un arrreglo dinámico.

Supongamos que a cada mat le asignamos un arreglo de TIPO_G de tamaño N, para obtener una matriz cuadrada (NxN). Para ello, a través de un ciclo for, recorremos el arreglo de punteros mat asignando memoria dinamica con la función calloc.

for(int i = 0; i < N ; i++)
    mat = (TIPO_G *) calloc(N , sizeof(TIPO_G));

Diagrama




Después de reservar memoria, se accede a los elementos de la matriz en forma común.

LIBERAR MEMORIA
Para liberar toda la memoria reservada , tenemos que empezar por liberar cada elemento del arreglo de punteros.

Ej : for(int i = 0; i < N ; i++) free(mat);

A continuación, se libera el espacio reservado para guardar los punteros (arreglo) a través del doble puntero.

Ej : free(mat);

Ejercicio

Dada la siguiente estructura :

typedef struct
{
   int edad;
   double saldo;
} INFO;
Crear un estructura que guarde este tipo de datos, de la forma :
 

Solución :

#include<stdlib.h>
#include<stdio.h>

typedef struct
{
   int edad;
   double saldo;
} INFO;

/* se declara que TIPO_G es de tipo INFO */

typedef INFO TIPO_G;

/* función que crea la seudo-matriz */

TIPO_G **crear_matriz(int n)
{
   TIPO_G **aux = NULL;
   aux = (TIPO_G **) calloc(n , sizeof(TIPO_G *));
 
   for(int i = 0; i < n ; i++ )
      aux = (TIPO_G *) calloc ( i + 1, sizeof(TIPO_G));
 
   return aux;
}


int main()
{

   TIPO_G **mat = crear_matriz(4);

/* se asignan valores a la fila 1 , columna 0 de la estructura */

   mat[1][0].edad = 22;
   mat[1][0].saldo = 106.456;

/* se guadan direcciones de los datos ingresados */

   int *ptr_edad = &mat[1][0].edad;
   double *ptr_saldo = &mat[1][0].saldo;

/* se libera memoria */
 
   for(int i = 0; i < 4; i++) free(mat);

   free(mat);

/* A continacion se imprime cualquier cosa */

   printf("\n edad : %d ",*ptr_edad);
   printf("\n saldo : %.3lf ",*ptr_saldo);
   return 0;
}
[size=109]Hack To Construct, Never To Destroy!!!![/size]

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Matriz Dinamica
« Respuesta #2 en: Viernes 28 de Mayo de 2004, 13:54 »
0
Hola.

Si trabajas con C++ puedes usar la clase MultiArray de la librería Boost:
Boost.MultiArray

Un saludo.

Ruben3d

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Matriz Dinamica
« Respuesta #3 en: Sábado 29 de Mayo de 2004, 01:06 »
0
muy bien Bgirl! :smartass:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io