Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Crear estructura en .h desde main

Estas en el tema de Crear estructura en .h desde main en el foro de C/C++ en Foros del Web. Quiero crear una matriz de dos dimensiones utilizando una estructura con una variable f para las filas y una c para las columnas y un ...
  #1 (permalink)  
Antiguo 07/01/2017, 11:43
 
Fecha de Ingreso: junio-2009
Mensajes: 30
Antigüedad: 14 años, 10 meses
Puntos: 0
Crear estructura en .h desde main

Quiero crear una matriz de dos dimensiones utilizando una estructura con una variable f para las filas y una c para las columnas y un vector donde se guardan los valores de la matriz. El problema que tengo en el main es que no puedo acceder a los datos de la matriz, al imprimir por ejemplo las columnas
printf("%d",(*M).c); // aquí da el error
No tengo acceso a los datos. Debería pasar la M como referencia, pero no me sale.
Lo tengo hecho de otra forma pasando sólo las filas y columnas y que la función CrearMatriz devuelva un dato de tipo Matriz, pero quiero que se haga así. Y me da fallo. No sé como hacer en el main para que los datos que se crean tengan accesibilidad desde él.
He probado pasando *M en lugar de M, vamos que estoy bloqueado y no me sale.
A ver si alguien puede ayudarme.
Saludos y GRACIAS.
Este es el matriz.h
Código:
typedef struct{
    int f;
    int c;
    int *vector;
}Matriz;
void CrearMatriz(Matriz *M, int f,int c);
Este es el matriz.c
Código:
#include "matriz.h"
void CrearMatriz(Matriz *M,int f, int c){
    
    int *vector;
       
    (M=(Matriz *)malloc(sizeof(Matriz)));
       
    (*M).f=f;
    (*M).c=c;
    // reservo memoria para el vector de tipo int por filas por columnas
    (vector=(int *)malloc(f*c*sizeof(int)));
   
    // le meto valores cero a los elementos de la matriz
    for (int i=0;i<f*c;i++){
        vector[i]=5;
    }
    // asignamos al vector el valor reservado en la función.
    M->vector = vector;
    // devuelvo el elemento de tipo matriz creado
   }
Este es el main.c

Código:
#include <stdio.h>
#include <stdlib.h>
#include "matriz.h"
   int main(int argc, char** argv) {
    Matriz *M;
    int f=3;
    int c=3;
    CrearMatriz(M,f,c);
    printf("%d",(*M).c);
    return (EXIT_SUCCESS);
}
  #2 (permalink)  
Antiguo 07/01/2017, 12:59
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Crear estructura en .h desde main

A la función CrearMatriz() le estás pasando, en efecto, un puntero a un tipo Matriz. Pero, dentro de esa función, estás asignando a M la direeción que te devuelve la función malloc(). Lo que ocurre es que lo que entra a CrearMatriz es una copia del puntero, y lo que hagas dentro de CrearMatriz() con esa copia del puntero se pierde al salir de la función. Con el añadido de que, en esa función, has reservado una memoria a la que ya no podrás acceder una vez que salgas de la función, pero queda marcada como reservada.

Hay dos posibles soluciones:

1. Para poder modificar ese puntero que has pasado como parámetro a la función, deberás pasar la dirección del puntero (es decir, un puntero a puntero).

Código C:
Ver original
  1. void CrearMatriz (Matriz **M, int f, int c)
  2. {
  3.     *M = (Matriz *)malloc(...)
  4.    
  5.     ...
  6.    
  7. }

2. La segunda opción es que la función devuelva un puntero a Matriz:

Código C:
Ver original
  1. Matriz *CrearMatriz (int f, int c))
  2. {
  3.     Matriz *P;
  4.    
  5.     P = (Matriz *)malloc(...)
  6.     P->vector = (int *)malloc(...)
  7.    
  8.     ...
  9.    
  10.         return P;
  11. }


Personalmente, prefiero esta segunda opción.

En el programa, quedaría:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "matriz.h"
  4.    int main(int argc, char** argv) {
  5.     Matriz *M;
  6.     int f=3;
  7.     int c=3;
  8.     M = CrearMatriz (f,c);
  9.     printf("%d", M->c);
  10. //
  11. // Llamar aquí a la función para borrar matriz
  12. //
  13.     return (EXIT_SUCCESS);
  14. }

Tendrías que crear también una función para eliminar una matriz.

Saludos,

Etiquetas: estructura, int, main
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:44.