elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Matriz dinamica en C [RESUELTO]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Matriz dinamica en C [RESUELTO]  (Leído 9,453 veces)
andie13

Desconectado Desconectado

Mensajes: 29


Ver Perfil
Matriz dinamica en C [RESUELTO]
« en: 17 Diciembre 2016, 15:04 pm »

Hola!
Quiero crear una matriz dinámica con funciones básicas.
Aquí solo hay una porción de código para guardar espacio, leer y escribir la matriz (soy consciente de que falta liberar la memoria y más cosas).
El caso es que no me funciona y creo que el fallo está en el modo de uso de punteros, pero no entiendo por qué. Si alguien me puede explicar por qué está mal, se lo agradezco mucho.
Gracias!

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct{
  5.    int filas;
  6.    int columnas;
  7.    int *datos;
  8. }Matriz;
  9.  
  10. void CrearMatriz (Matriz *m, int f, int c){
  11.    m=(Matriz*)malloc(sizeof(Matriz));
  12.  
  13.    f=m->filas;
  14.    c=m->columnas;
  15.    m->datos=(int*)malloc(f*c*sizeof(int));
  16.  
  17.    if (m==NULL || m->datos==NULL){    
  18.        printf("Memoria insuficiente.\n");
  19.        exit(1);
  20.    }
  21. }
  22. void LeerMatriz(Matriz *m){
  23.    int i=0,j=0;
  24.    for(i=0; i<m->filas; i++)
  25.    {
  26.        for(j=0; j<m->columnas; j++)
  27.        {              
  28.            printf("Escriba o valor para M(%d,%d) = ",i+1,j+1);
  29.            scanf("%d",*(m->datos + i+j));
  30.        }
  31.    }
  32. }
  33.  
  34. void EscribirMatriz(Matriz *m){
  35.    int i=0,j=0;
  36.  
  37.    printf("\n\tLa matriz es: "); /*RUTINA PARA IMPRIMIR*/
  38.    for(i=0;i<m->filas;i++){
  39.        printf("\n\t");
  40.        for(j=0;j<m->columnas;j++){
  41.            printf("  %d  ", *(m->datos+i)+j); //M[i][j]
  42.            }
  43.    }
  44. }
  45.  
  46. void TransponerMatriz(Matriz *m){
  47.    int i=0,j=0;
  48.  
  49.    printf("\n\n\tLa transpuesta es: ");/*IMPRIMIR MATRIZ TRANSPUESTA*/
  50.    for(i=0;i<m->columnas;i++){
  51.        printf("\n\t");
  52.        for(j=0;j<m->filas;j++){
  53.            printf("  %d  ", *(m->datos+i+j)); //M[j][i]
  54.            }
  55.    }
  56. }
  57. int main(){
  58.    Matriz m;
  59.  
  60.    printf("Introduzca numero de filas: ");
  61.    scanf("%d",&m.filas);
  62.    printf("Introduzca numero de columnas: ");
  63.    scanf("%d", &m.columnas);
  64.  
  65.    CrearMatriz(&m,m.filas,m.columnas);
  66.    LerMatriz(&m);
  67.    EscribirMatriz(&m);
  68.    TransponerMatriz(&m);
  69.    return 0;
  70. }


« Última modificación: 18 Diciembre 2016, 00:38 am por andie13 » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Matriz dinamica en C [Ayuda]
« Respuesta #1 en: 17 Diciembre 2016, 15:07 pm »

Si no te compila, es por unas razones. Esas razones, te las dice el compilador en los errores. ¿Qué errores te da el compilador?


En línea

andie13

Desconectado Desconectado

Mensajes: 29


Ver Perfil
Re: Matriz dinamica en C [Ayuda]
« Respuesta #2 en: 17 Diciembre 2016, 15:16 pm »

Perdón, me expresé mal.
Sí que me compila, lo que hace es que no funciona correctamente. Perdón por la mala expresión.
Yo creo que el error está en los scanf o algo parecido, porque el programa al ejecutarlo sí que me deja indicarle el número de filas y columnas y me pide una matriz del correspondiente tamaño.

Gracias por tomarte tu tiempo respondiéndome.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Matriz dinamica en C [Ayuda]
« Respuesta #3 en: 17 Diciembre 2016, 15:22 pm »

En ese caso, sé más específico con qué problema te da :P

De todos modos, mira esto:
Código
  1. scanf("%d",*(m->datos + i+j));

Para (i=0, j=2), será "m->datos + 2". Para (i=2, j=0), será "m->datos + 2". Es decir, lo mismo.

Tienes varias opciones. La más fácil sería tener una matriz de 2 dimensiones con un doble puntero (int**). Así, podrías acceder a los datos de esta forma: m->datos[0][2], sin necesidad de hacer operaciones manualmente.

Te redirijo aste post que encontré por Google: http://www.linuxhispano.net/2011/08/17/reservar-memoria-dinamica-para-una-matriz-en-c/
Ahí ves un código de ejemplo simple.
En línea

andie13

Desconectado Desconectado

Mensajes: 29


Ver Perfil
Re: Matriz dinamica en C [Ayuda]
« Respuesta #4 en: 17 Diciembre 2016, 15:48 pm »

Gracias por la aportación  ;).
Aún así, he declarado el campo de la estructura con un vector de punteros **datos, y he cambiado el scanf que me has dicho, pero me da error justo al llegar a esa línea de código. No sé si es que te he entendido mal y no lo puse como me dijiste, o si se debe a otra cosa.
Muchas gracias!

Código
  1. void LeerMatriz(Matriz *m)
  2. {
  3.    int i=0,j=0;
  4.    for(i=0; i<m->filas; i++)
  5.    {
  6.        for(j=0; j<m->columnas; j++)
  7.        {              
  8.            printf("Escriba o valor para M(%d,%d) = ",i+1,j+1);
  9.            scanf("%d", m->datos[i][j]);
  10.        }
  11.    }
  12. }
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Matriz dinamica en C [Ayuda]
« Respuesta #5 en: 17 Diciembre 2016, 15:58 pm »

Bueno, hay que cambiar a un int**, y hay que hacer un par de cosas más.
En primer lugar, a la hora de crear la matriz, que es lo que pasé en el link. Primero, reservamos memoria para X punteros, que serán las columnas (o las filas, como sea). Luego, a cada uno de esos punteros le reservamos memoria para 1 file (o columna). Así, el pimer puntero dirige a un "array de columnas", y cada array de columnas es un array de celdas, una fila.
Echa un ojo al código de la url.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Matriz dinamica en C [Ayuda]
« Respuesta #6 en: 17 Diciembre 2016, 21:49 pm »

Si no has tocado crearMatriz y sigues con el código original tienes el problema de qur perderás la dirección adquirida con malloc cuando salgas de la función.

Como solo pasas un puntero, m, has de tener en cuenta de que pasas una copia de la dirección así, cuando la cambies con el uso de malloc, la dirección en main no habrá cambiado. Has adquirido la dirección y la habrás llenado pero la perderás.

Para solucionar esto usa un puntero a puntero,  así podrás pasar el puntero por referencia y podrás cambiarlo. O haces que la función regrese un puntero hacer un return al puntero creado con malloc. En este caso no hace falta que pases el puntero por los argumentos de la función.
En línea

andie13

Desconectado Desconectado

Mensajes: 29


Ver Perfil
Re: Matriz dinamica en C [Ayuda]
« Respuesta #7 en: 18 Diciembre 2016, 00:20 am »

Si elimino
Código
  1. m=(Matriz*)malloc(sizeof(Matriz));
me funciona correctamente. ¿Debería de ejecutar algún bucle para guardar memoria o quitando eso llegaría? así no me da problema ninguno.
gracias por responder!
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Matriz dinamica en C [RESUELTO]
« Respuesta #8 en: 18 Diciembre 2016, 00:51 am »

Déjalo así. Ahora funciona por la razón de que estás modificando un objeto que existe en main. Pero sí que deberás liberar la memoria de la variable datos, dentro de la estructura.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
lista con matriz dinamica
Programación C/C++
L·Storm! 2 4,076 Último mensaje 3 Agosto 2011, 03:03 am
por L·Storm!
Expandir matriz dinámica?
Programación C/C++
Metal-byte 2 5,731 Último mensaje 22 Enero 2012, 23:06 pm
por rir3760
Memoria dinamica matriz
Programación C/C++
programacion_c 1 2,811 Último mensaje 25 Abril 2012, 00:23 am
por david_BS
Problema con matriz dinámica
Programación C/C++
NathanD 4 2,725 Último mensaje 31 Mayo 2013, 17:26 pm
por rir3760
Juego con matriz dinámica en c++, función para rrecorrer matriz
Programación C/C++
jajaimess 1 3,441 Último mensaje 21 Junio 2014, 05:21 am
por .:UND3R:.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines