elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 02:52  


Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Pregunta Memoria Dinámica En "Matrices"
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pregunta Memoria Dinámica En "Matrices"  (Leído 528 veces)
ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Pregunta Memoria Dinámica En "Matrices"
« en: 1 Diciembre 2011, 18:12 »

He Estudiado Mucho Sobre Este Tema, Se Que Se Debe usar Punteros Y Malloc

1.- Alguien Me Puede Explicar Como Crear Una Matriz Dinámica de 2 dimensiones (Filas, Columnas)
2.- Y por que se debe usar doble puntero?
3.- Debo hacer un malloc aparte para filas y columnas?


PD: ES EN PROGRAMACIÓN C


En línea
naderST


Desconectado Desconectado

Mensajes: 467



Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #1 en: 1 Diciembre 2011, 18:50 »

2. No necesariamente se debe usar puntero a puntero, esto solo es una manera de implementarlo.

3. Con un solo malloc lo puedes hacer porque en C las matrices se representan en memoria por filas de esta manera:

1 2 3
4 5 6

En memoria sería así:

1 2 3 4 5 6

1. En el código puedes ver como se reserva una matriz dinámica sin usar puntero a puntero, como se puede tratar como una fila y bueno cualquier duda avísame se me debieron escapar muchas cosas.

Código
#include <stdio.h>
#include <stdlib.h>
#define FILAS 2
#define COLUMNAS 3
 
int matriz[FILAS][COLUMNAS] = { {1,2,3}, {4,5,6}};
 
int * matriz_dinamica;
 
/*
   imprimir tratando la matriz como vector
*/

void imprimir_vector(int vector[]){
   register int i;
 
   for(i=0;i<FILAS*COLUMNAS;i++)
       printf("%d ", vector[i]);
   printf("\n");
}
 
/*
   imprimir tratando la matriz como un puntero
*/

void imprimir_puntero(int * matriz){
   register int i;
 
   for(i=0;i<FILAS*COLUMNAS;i++)
       printf("%d ", matriz[i]);
   printf("\n");
}
 
int main()
{
   register int i,j;
 
   imprimir_vector(matriz);
   imprimir_puntero(matriz);
 
   int (*ptr_matriz)[COLUMNAS];    // Apuntador a una matriz
 
   matriz_dinamica = (int*)malloc(sizeof(int)*FILAS*COLUMNAS);
 
   ptr_matriz = matriz_dinamica;
 
   ptr_matriz[0][0] = 1;
   ptr_matriz[0][1] = 2;
   ptr_matriz[0][2] = 3;
 
   ptr_matriz[1][0] = 4;
   ptr_matriz[1][1] = 5;
   ptr_matriz[1][2] = 6;
 
   for(i=0;i<FILAS;i++){
       for(j=0;j<COLUMNAS;j++)
           printf("%d ", ptr_matriz[i][j]);
       printf("\n");
   }
 
   free(matriz_dinamica);
 
   return 0;
}
 

NOTA: Para las matrices el compilador debe saber el numero de columnas de la matriz, ya que cuando usas el operador [] se resuelve de la siguiente manera:

Código
matriz[i][j] = matriz + i * COLUMNAS + j
 


« Última modificación: 1 Diciembre 2011, 18:58 por naderST » En línea
ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #2 en: 1 Diciembre 2011, 23:32 »

Podrías Mandar Ese Código otra vez con comentario de que hace o decirme abajo que hace cada función?
En línea
naderST


Desconectado Desconectado

Mensajes: 467



Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #3 en: 2 Diciembre 2011, 01:11 »

En el código en el main cuando llamas a malloc() lo que hace es reservar memoria para una matriz de enteros de tamaño FILAS*COLUMNAS, pero lo tratas como si fuera un vector porque en C las matrices se representan en memoria como vectores.
En línea
ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #4 en: 2 Diciembre 2011, 01:12 »

Tengo Este Codigo

Código:
int *arreglo;
int k, int filas, int columnas,i,j;
arreglo = (int*) malloc(filas*columnas*sizeof(int));
   for(i=0;i<=3;i++)
   {
     for(j=0;j<=3;j++)
      {
        arreglo[k] = i*columnas + j;
       }
    }

como hacer para que el arreglo sea arreglo[j] y no un arreglo de largo filas*columnas???

necesito tomarlo como una matriz
En línea
ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #5 en: 2 Diciembre 2011, 01:14 »

Es que existen 2 formas de crear un arreglo dinámico según lo k me informe:


1: Arreglo de arreglos dinámicos
2: Renglones o Columnas de orden mayor (que es lo que me mandaste)
En línea
naderST


Desconectado Desconectado

Mensajes: 467



Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #6 en: 2 Diciembre 2011, 02:00 »

Disculpa pero no entiendo tu pregunta.
En línea
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #7 en: 2 Diciembre 2011, 02:07 »

Se refiere a las dos formas de reservar memoria para emular una matriz.

1) El primer caso es el usual donde se reserva primero un bloque de memoria principal donde se almacenaran las direcciones en memoria del inicio de cada fila. A continuacion se reserva la memoria de cada una de ellas.

Mas o menos asi:
Código
int **mat;
int i;
 
/* ... */
 
/* 10 filas por 20 columnas */
mat = malloc(10 * sizeof *mat);
 
for (i = 0; i < 10; i++)
  mat[i] = malloc(20 * sizeof *mat[i]);

2) El segundo caso ya lo explicaste (me refiero a naderST).

Un saludo
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #8 en: 2 Diciembre 2011, 02:13 »

El primer caso es Hacer Un arreglo Dinámico Dentro De otro Arreglo Dinámico, el segundo que es ese código que pusiste es pasar la matriz a un arreglo dinámico.
En línea
naderST


Desconectado Desconectado

Mensajes: 467



Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #9 en: 2 Diciembre 2011, 02:43 »

Googlea que hay varios ejemplos de matrices dinámicas con puntero a puntero.
En línea
ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #10 en: 2 Diciembre 2011, 02:45 »

Sep es que el problema es que son solo del segundo tipo.... y necesito de 2 dimensiones... seguiré buscando haber si encuentro algo
En línea
ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #11 en: 2 Diciembre 2011, 03:17 »

Alguien me puede decir que hace esta funcion??? no me manejo mucho con doble puntero


Citar
int **matriz;
int i, int filas_dinamicas, int columnas_dinamicas;
matriz = (int**) malloc(filas_dinamicas*sizeof(int));
    for(i=0;i<filas_dinamicas;i++)
    {
      matriz = (int**)malloc(columnas_dinamicas*sizeof(int));
    }
En línea
ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Pregunta Memoria Dinámica En "Matrices"
« Respuesta #12 en: 2 Diciembre 2011, 03:49 »

Cual es la diferencia entre este y el que mande arriba??? este lo probe y me funciono, lo que hace es crear un puntero matriz que este caso sera una matriz de filas y columnas de n*m valores, lo que hace con malloc es inicializarla, pueden probar con Matriz[1][3]=1; e imprimirlo y funciona

Código:
int *matriz;
int i, int filas_dinamicas, int columnas_dinamicas;
matriz = malloc(filas_dinamicas*sizeof(int));
    for(i=0;i<filas_dinamicas;i++)
    {
      matriz = malloc(columnas_dinamicas*sizeof(int));
    }


En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines