/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Pregunta Sobre Matriz Dinamica en C

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
ZedGe



Registrado: 03 May 2011
Mensajes: 14

MensajePublicado: 02/12/2011 7:46 am
Título: Pregunta Sobre Matriz Dinamica en C

Tengo 2 códigos sobre Matrices dinámicas, el problema es que no se cual usar alguien me podría explicar la diferencia y las funciones que cumplen?

Código:

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));
    }
matriz[1][1]=1;


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));
    }
matriz[1][1]=1;
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6586
Ubicación: Mexico

MensajePublicado: 02/12/2011 9:50 am
Título:

Ninguno ya que en ambos se pierden las direcciones de los bloques de memoria al ejecutarse el bucle:
Código:
/* Ejecutamos el bucle "filas_dinamicas" veces */
for (i = 0; i < filas_dinamicas; i++){
   /*
   ** En cada iteracion se reserva un bloque y se pierde
   ** el anterior ya que la variable utilizada es la MISMA
   */
   matriz = (int**) malloc(columnas_dinamicas*sizeof(int));
}

Y el lenguaje C no requiere de la conversión explicita.

Mejor indicamos que es lo que tratas de hacer para darte un ejemplo que funcione.

Un saludo
_________________
Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short.
--
Mentat Handbook
Volver arriba
ZedGe



Registrado: 03 May 2011
Mensajes: 14

MensajePublicado: 02/12/2011 10:13 am
Título:

Le un archivo txt, o cualquier cosa, el cual me retorna un M y un N.. que es el largo y ancho de mi archivo, necesito pasar eso a una matriz.

Es decir el primer dato de mi txt que seria A queda en matriz[0][0];

Necesito hacer operaciones con los vecinos de esa celda, es por ezo que necesito una matriz y guardar lo que lee en una matriz de M filas y N columnas
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6586
Ubicación: Mexico

MensajePublicado: 02/12/2011 10:43 am
Título:

OK. Supongamos un archivo de texto con estos datos:
Código:
          3  5
 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15

Ahí los dos primeros números son las filas y columnas de la matriz y a continuación cada uno de los valores.

Primero se debe reservar un bloque de memoria principal donde estarán las direcciones de cada una de las filas.

Después reservamos cada fila almacenando esa dirección en el bloque de memoria principal:
Código:
#include <stdio.h>
#include <stdlib.h>

#define NOM_ENTRADA  "Entrada.txt"

int main(void)
{
   FILE *entrada;
   int **mat;
   int num_filas;
   int num_cols;
   int i;
   int j;
   
   entrada = fopen(NOM_ENTRADA, "rt");
   
   /* Leemos el numero de filas y columnas */
   fscanf(entrada, "%d %d", &num_filas, &num_cols);
   
   /* Reservamos el bloque principal */
   mat = malloc(num_filas * sizeof *mat);
   
   /* Reservamos la memoria para cada fila */
   for (i = 0; i < num_filas; i++)
      mat[i] = malloc(num_cols * sizeof *mat[i]);
   
   /* Leemos los valores del archivo de entrada */
   for (i = 0; i < num_filas; i++)
      for (j = 0; j < num_cols; j++)
         fscanf(entrada, "%d", mat[i] + j);
   fclose(entrada);
   
   /* Prueba: impresion de los valores */
   for (i = 0; i < num_filas; i++){
      for (j = 0; j < num_cols; j++)
         printf("%3d", mat[i][j]);
     
      putchar('\n');
   }
   
   /* Liberacion de la memoria utilizada */
   for (i = 0; i < num_filas; i++)
      free(mat[i]);
   free(mat);
   
   return EXIT_SUCCESS;
}


Su salida es:
Código:
  1  2  3  4  5
  6  7  8  9 10
 11 12 13 14 15


Un saludo
_________________
Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short.
--
Mentat Handbook
Volver arriba
ZedGe



Registrado: 03 May 2011
Mensajes: 14

MensajePublicado: 02/12/2011 10:53 am
Título:

Amigo por que al guardar los datos con

Código:
fscanf(entrada, "%d", mat[i] + j);



dices que se guardan en mat[i] + j?

Es la única parte de tu código que no entendí, lo que tenia entendido es que se guardaban en la primera fila, luego cuando se acaban las columnas pasa a la siguiente fila:

Código:

mat[0][0] = 1;
mat[0][1] = 2;
mat[0][2] = 3;
mat[0][3] = 4;
mat[0][4] = 5;

mat[1][0] = 6;
.........



pero no entiendo por que mat[i] + j, creo haber visto que lo asignan asi pero no se por que[/code]
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6586
Ubicación: Mexico

MensajePublicado: 02/12/2011 11:33 am
Título:

ZedGe escribió:
por que al guardar los datos con
Código:
fscanf(entrada, "%d", mat[i] + j);

dices que se guardan en mat[i] + j?

Por partes:

Las funciones scanf y fscanf necesitan las direcciones en memoria donde almacenar los valores que vayan leyendo. Para ello lo usual es, por poner un ejemplo:
Código:
int numero[10]
int i;

/* ... */

/* Leemos los dies numeros */
for (i = 0; i < 10; i++)
   scanf("%d", &numero[i]);

Ahi "&numero[i]" es la dirección en memoria del elemento "i", otra forma que podemos utilizar (en base al hecho de que "numero" en ese contexto ya es un puntero) es "numero + i".

En buen cristiano:
Código:
&numero[i]  ==> direccion en memoria del elemento i
 numero + i ==> idem


En el programa de mi mensaje anterior el caso es similar: podemos utilizar "&mat[i][j]" o "mat[i] + j" ya que ambas generan la dirección del elemento "j" en el array "mat[i]", utilice la segunda porque es mas corta (y sugiere el hecho de que "mat[i]" es un puntero).

Un saludo
_________________
Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short.
--
Mentat Handbook
Volver arriba
ZedGe



Registrado: 03 May 2011
Mensajes: 14

MensajePublicado: 02/12/2011 2:46 pm
Título:

Aaaaaa perfecto ya entendi, es que como no lo hacia de esa forma tenia la duda... muchas gracias amigo te pasaste
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com