/
Inicio :: Foros

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

TDA Matriz - Problema punteros

 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
SimonBanquillo



Registrado: 16 Sep 2011
Mensajes: 2

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 20/09/2011 11:06 am
Título:

Gracias por la ayuda, y los consejos. Saludos.
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
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