C/Visual C - Problema al incluir struct en cabeceras.h

 
Vista:
sin imagen de perfil

Problema al incluir struct en cabeceras.h

Publicado por Diego (150 intervenciones) el 30/05/2016 00:34:27
Buenas tardes, tengo un problema al intentar usar estructuras en cabeceras.

Enunciado:

Defina una estructura que represente una fecha.
(a) Implemente una función que reciba una variable del tipo creado por referencia e inicialice los valores en el 1 de enero de 1970

Fin enunciado;

Yo suelo usar cabeceras al momento de compilar el programa, pero con estructuras no puede hacer funcionar los .h

Asi que tuve que hacer las funciones y el programa principal en el mismo archivo.

Main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
typedef struct {
	unsigned int dia;
	unsigned int mes;
	unsigned int anio;
}T_fecha;
void setear(T_fecha *fecha);
int main(int argc, char *argv[]){
	T_fecha fecha;
	setear(&fecha);
	printf("%d/%d/%d\n", fecha.dia, fecha.mes, fecha.anio);
	return 0;
}
void setear(T_fecha *fecha)
{
	(*fecha).dia = 1;
	(*fecha).mes = 1;
	(*fecha).anio = 1970;
}

iniciar.h:

1
void setear(T_fecha *);

iniciar.c:

1
2
3
4
5
6
void setear(T_fecha *fecha)
{
	(*fecha).dia = 1;
	(*fecha).mes = 1;
	(*fecha).anio = 1970;
}

Yo quiero quitar las funciones del main.c e invocar #include "iniciar.h" con: gcc -Wall -o main.exe main.c iniciar.c

Main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include "iniciar.h"
typedef struct {
	unsigned int dia;
	unsigned int mes;
	unsigned int anio;
}T_fecha;
int main(int argc, char *argv[]){
	T_fecha fecha;
	setear(&fecha);
	printf("%d/%d/%d\n", fecha.dia, fecha.mes, fecha.anio);
	return 0;
}
}

Cuando intento modularizar con las cabeceras me arroja el error: unknown type name ‘T_fecha’

no encontré ejemplos del uso de struct en una cabecera.h y de ahí mi desconcierto

¿Como debería declarar las estructuras para que sean reconocidas por las cabeceras.h?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problema al incluir struct en cabeceras.h

Publicado por Capitan Kirk (97 intervenciones) el 30/05/2016 15:04:07
Archivo "iniciar.h":

1
2
3
4
5
6
7
8
9
typedef struct
{
	unsigned int dia;
	unsigned int mes;
	unsigned int anio;
}
T_Fecha;
 
void setear(T_fecha *fecha);

Archivo "iniciar.c":
1
2
3
4
5
6
7
8
#include "iniciar.h"
 
void setear(T_fecha *fecha)
{
	(*fecha).dia = 1;
	(*fecha).mes = 1;
	(*fecha).anio = 1970;
}

Archivo "main.c":
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include "iniciar.h"
 
int main(int argc, char *argv[])
{
	T_fecha fecha;
	setear(&fecha);
	printf("%d/%d/%d\n", fecha.dia, fecha.mes, fecha.anio);
	return 0;
}

¿Ves las diferencias respecto de lo que tenías?

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al incluir struct en cabeceras.h

Publicado por Chema (234 intervenciones) el 30/05/2016 18:43:35
gcc -Wall -o main main.c iniciar.c -I ./

main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdlib.h>
#include <stdio.h>
#include <iniciar.h>
 
 
int main(void) {
	Date *date;
	date = malloc(sizeof(Date));
 
	ResetDate(date);
	SetDate(date);
 
	printf("%d\n%d\n%d\n", date->dia, date->mes,date->ano);
	free(date);
	return 0;
}

iniciar.c
1
2
3
4
5
6
7
8
9
10
11
#include "iniciar.h"
 
void SetDate(Date *date){
	date->dia = 1;
	date->mes = 2;
	date->ano = 1970;
}
 
void ResetDate(Date *date){
	date = 0X0;
}

iniciar.h
1
2
3
4
5
6
7
8
9
10
11
/*
*La suma son 32 bites, un int a 32 bits
*/
typedef struct Date{
	unsigned int dia :5; 	/*0--31*/
	unsigned int mes :4;	/*0..15*/
	unsigned int ano :23;	/*0..8388607*/
}Date;
 
extern void SetDate(Date *date);
extern void ResetDate(Date *date);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problema al incluir struct en cabeceras.h

Publicado por agustin (272 intervenciones) el 31/05/2016 00:12:25
Aqui:
1
2
3
4
5
typedef struct Date{
	unsigned int dia :5; 	/*0--31*/
	unsigned int mes :4;	/*0..15*/
	unsigned int ano :23;	/*0..8388607*/
}Date;
¿Podrías explicar que es eso de los dos puntos y el número detras y para que sirve? Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al incluir struct en cabeceras.h

Publicado por Capitan Kirk (97 intervenciones) el 31/05/2016 13:03:11
Se trata de una estructura de campos de bits. Los dos puntos es un separador para este tipo de estructuras, y el número indica el número de bits de anchura del campo. En este tipo de estructuras, el tipo es siempre unsigned (no es necesario poner int). Se utilizan cuando necesitas ahorrar espacio y los elementos de la estructura, individualmente, no necesitan el rango completo de un unsigned. Los elementos estarán empaquetados, y se irán añadiendo unsigneds conforme sea necesario. Dado que no sabes de antemano en qué orden van a quedar empaquetados, dependiendo de si la máquina es Big-endian o Little-endian y, especialmente, si el tamaño total es de más de un unsigned, puedes acceder a los elementos como en una estructura normal (por ejemplo, Date.dia ó Date->dia), pero no podrás utilizar, por ejemplo, &Date.dia, dado que la dirección de un elemento de un campo de bits no estará definida. Así, no podrás hacer, por ejemplo,

scanf("%d", &Date.dia),;

sino que tendrás que hacerlo mediante una variable intermedia:

scanf("%d", &VarTemp);
Date.dia = VarTemp;

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema al incluir struct en cabeceras.h

Publicado por Diego (150 intervenciones) el 31/05/2016 21:59:08
Gracias, por la respuesta, ya comprendí como poderlos struct en las cabeceras. Y voy a leer mas al respecto de la definicion de los bits con los dos puntitos en los campos de un struct.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problema al incluir struct en cabeceras.h

Publicado por agustin (272 intervenciones) el 02/06/2016 00:55:08
O sea que lo que haces es que en realidad ocupa el espacio de un solo unsigned int y repartes los bits entre esos elementos. ¿es así?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al incluir struct en cabeceras.h

Publicado por Capitan Kirk (97 intervenciones) el 02/06/2016 11:51:35
Un unsigned o más (depende del total de bits que vayas a utilizar). Este tipo de estructuras suelen utilizarse, por ejemplo, para permitir gestionar con facilidad y directamente los puertos de entrada/salida de un microcontrolador, en lugar de hacerlo bit por bit (lo que lo haría más engorroso de manejar y más propenso a errores).
En casos como el de la estructura que has puesto no vale la pena, salvo que realmente tengas un problema grave de espacio de memoria (difícilmente te lo encontrarías en un ordenador normal). Ten en cuenta que el acceso individual a cada elemento será más lento que si empleas un entero para cada elemento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al incluir struct en cabeceras.h

Publicado por Chema (234 intervenciones) el 02/06/2016 18:30:45
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
typedef struct Fecha {
	unsigned int dia 	:5; 	/*0--31*/
	unsigned int mes 	:4;	/*0..15*/
	unsigned int ano 	:11;	/*0..2047*/
	unsigned int trimestre	:3;     /*0..3*/
	unsigned int semana	:6;	/*0..63*/
	unsigned int flag_a	:1;
	unsigned int flag_b	:1;
	unsigned int flag_c	:1;
}Fecha;
 
typedef struct Calendario {
	unsigned int ano 	:11;	/*0..2047*/
	unsigned int dia 	:9; 	/*0--511*/
	unsigned int semana	:6;	/*0..63*/
	unsigned int trimestre	:3;     /*0..3*/
	unsigned int bisiesto	:1;
	unsigned int flag_b	:1;
	unsigned int flag_c	:1;
}Fecha;
 
 
typedef struct Usuario {
	unsigned int identificador 	:24; 	/*0--16777215*/
	unsigned int permiso	     :4;	/*0..15*/
	unsigned int flag_a		:1;
	unsigned int flag_b		:1;
	unsigned int flag_c		:1;
	unsigned int flag_d		:1;
}Usuario;
 
 
 
Con un poco de imaginación , con poco haces mucho.
 
Desarrollo ETL (Extract, transform and load ), de los grandes grandes , uso frecuentemente
 campos de bits en sitios críticos como las cabeceras de las páginas que almacenan
 los datos, estas cabeceras se leen miles de millones de veces y no he notado nada raro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar