| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
SimonBanquillo
Registrado: 16 Sep 2011 Mensajes: 2
| Publicado: 16/09/2011 12:35 am | | | Título: TDA Matriz - Problema punteros |
| Hola colegas. Estoy empezando a ver el tema de punteros, y tengo un problema con un ejercicio que incluye un TDA de una matriz. Mi problema es que obtengo un "Segmentation fault" cuando quiero acceder a la matriz desde el main. Tal vez no estoy haciendo bien el acceso a la estructura. Les agradecería que me den una mano. Saludos.
ESTRUCTURA - matriz.h ----------------------------------
| Código: | /* Name : matriz.h */
#ifndef MATRIZ_H_ #define MATRIZ_H_
/* Defino Matriz*/
typedef struct sMatriz{ unsigned int dimx, dimy; int **coordenadas; } Matriz;
#endif
#ifndef MATRIZ_FUNCIONES_H_ #define MATRIZ_FUNCIONES_H_
int Matriz_crear(Matriz* m, unsigned int dimx, unsigned int dimy); /*Pre: La matriz ha sido creada Post: Se liberan los recursos asociados a la matriz*/
#endif
|
IMPLEMENTACION - matriz.c ----------------------------------
| Código: |
#include <stdio.h> #include <stdlib.h> #include "matriz.h"
int Matriz_crear(Matriz *m, unsigned int dimx, unsigned int dimy){
/* Variables para recorrer matriz */ unsigned int i,j;
if(dimx && dimy) /* dimx != 0 && dimy != 0 */ { m = (Matriz*) malloc(sizeof(Matriz));
m->dimx = dimx; m->dimy = dimy;
m->coordenadas = (int**) malloc(sizeof(int*) * dimx);
for(i=0; i<dimx; i++) { m->coordenadas[i] = (int*) malloc(sizeof(int) * dimy);
for(j=0; j<dimy; j++) { m->coordenadas[i][j] = 5;
/* Impresión de prueba */ printf("m->coordenadas[%d][%d] = %d\n", i, j, m->coordenadas[i][j]); } }
return 0; } else { return 1; } }
|
APLICACION - pruebaMatriz.c ---------------------------------------------
| Código: | /* Name : pruebaMatriz.c */
#include <stdio.h> #include "matriz.h"
int main(int argc, char** argv){
unsigned int dimx, dimy; unsigned int i, j; Matriz m;
dimx = 3; dimy = 3;
if(!Matriz_crear(&m, dimx, dimy)){
printf("Desde main:\n");
for(i=0; i<dimx; i++){ for(j=0; j<dimy; j++){ /* Impresión de prueba */ printf("m->coordenadas[%d][%d] = %d\n", i, j, m.coordenadas[i][j]); } }
}else{ printf("Matriz no creada."); } return 0; }
|
Puedo ver la matriz creada al imprimir en pantalla desde adentro de la funcion Matriz_crear, pero no desde el main.
Agradeceré su ayuda y recomendaciones. Gracias. |
| | Volver arriba | |  | RODLON
Registrado: 09 Sep 2011 Mensajes: 3 Ubicación: Huesca
| Publicado: 20/09/2011 1:47 am | | | Título: |
| Hola. Creo que el problema es que no puedes hacer que la variable "m" que creas en el main apunte a otro sitio. Lo que podrias hacer es, en vez de crear una variable de tipo Matriz, crear un puntero a una Matriz.
La mejor solucion seria que la funcion matriz_crear no reciebiera un puntero, si no una matriz directamente. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7516 Ubicación: Mexico
| Publicado: 20/09/2011 7:58 am | | | Título: |
| El error se encuentra en la definición de la función "Matriz_crear", esta recibe la dirección en memoria del objeto de tipo "Matriz" que sera modificado mediante indireccion. No necesitas reservar memoria, en su lugar accedes a sus campos directamente.
La función corregida es:
| Código: | int Matriz_crear(Matriz *m, unsigned int dimx, unsigned int dimy) { unsigned int i, j; if (dimx && dimy){ m->dimx = dimx; m->dimy = dimy; m->coordenadas = malloc(dimx * sizeof *m->coordenadas); for (i = 0; i < dimx; i++){ m->coordenadas[i] = malloc(dimy * sizeof *m->coordenadas[i]); for (j = 0; j < dimy; j++) m->coordenadas[i][j] = 5; } return 0; }else { return 1; } } |
Como nota: lo usual con funciones que retornan un valor de tipo entero es tomar el valor cero como un indicador de error (y no al revés como sucede con tu programa).
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 |
| | Volver arriba | |  | | SimonBanquillo
Registrado: 16 Sep 2011 Mensajes: 2
| Publicado: 20/09/2011 11:06 am | | | Título: |
| | Gracias por la ayuda, y los consejos. Saludos. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |