Pasar estructura a archivo distinto del que contiene la función main[C]

Iniciado por DanielPy, 11 Mayo 2015, 19:33 PM

0 Miembros y 1 Visitante están viendo este tema.

DanielPy

Hola Gente.
Estoy aprendiendo a modular código en c y en el código que les dejo a continuación me da el siguiente error. Error: nombre de tipo desconocido 'Fecha', en las líneas 3:14 y 3:28.-
Dentro del mismo archivo siempre pase de esta manera las estructuras a funciones o cuando es muy grande con una variable puntero, pero en este caso me da error.-

#include <stdio.h>
#include <windows.h>
#include <time.h>
#include "fechaDifDias.c"

#define MENSAJE printf( "\n\n Pulse [Enter] para continuar..." ); getchar();

typedef struct{
int orden;
char b;
char fecha[11];
float verduras;
float almacen;
char nota[101];
}Super;

typedef struct{
int dia;
int mes;
int año;
}Fecha;

int mainMenu(void);
void contarRegistros( FILE *ptrFile, Super *super, int *registros, int tamStructSuper );
void rellenar_estructura(FILE *ptrFile, Super *super, int *opcRe);
void escribir_archivo(FILE *ptrFile, Super *super, int tamStructSuper, int registros);
void leer_archivo(FILE *ptrFile, Super *super, int registros, int cualLeer, int tamStructSuper);
void buscar(FILE *ptrFile, Super *super, int tamStructSuper, int *contarReg, int *cualLeer);
int resBusqueda(Super *super);
void consultation(FILE *ptrFile, Super *super, int tamStructSuper);
int validarFechas(  Fecha inicio, Fecha final, Fecha consulta );
void feDiDi( Fecha inicio, Fecha final, int *totalDias );

int main(void){
mainMenu();

return 0;
}


int mainMenu(void){
Super super = {0};
int ok, ch, opcMp, registros, contarReg=1, cualLeer=1, opcRe;
int tamStructSuper = sizeof(int) + sizeof(char) + (sizeof(char)*11) + sizeof(float) + sizeof(float) + (sizeof(char)*101);

FILE *ptrFile;
if(( ptrFile = fopen( "gastos.txt", "ab+" ) ) == NULL){
perror( "\n\n error" );
return 1;
}

while( opcMp != 8){
do{
system( "cls" );

if( contarReg == 1 ){
contarRegistros( ptrFile, &super, &registros, tamStructSuper );
leer_archivo( ptrFile, &super, registros, cualLeer , tamStructSuper);
contarReg = 0;
cualLeer = 1;
}

printf( "\n\n ========== Men%c principal ===========", 163 );

printf( "\n\n 1 - Buscar" );
printf( "\n 2 - Agregar" );
printf( "\n 3 - Modificar" );
printf( "\n 4 - Borrar" );
printf( "\n 5 - Consulta" );
printf( "\n 6 - Marcados para borrar" );
printf( "\n 7 - Empaquetar tabla" );
printf( "\n 8 - Finalizar" );

printf( "\n\n Ingrese opci%cn.....: ", 162 );
ok = scanf( "%d", &opcMp) == 1 && opcMp >=1 && opcMp <=8;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

switch(opcMp){
case 1 :
if( registros >= 1){
buscar(ptrFile, &super, tamStructSuper, &contarReg, &cualLeer);
}else{
printf( "\n\n No tiene ningun movimiento grabado" );
MENSAJE;
}
break;
case 2 :
rellenar_estructura( ptrFile, &super, &opcRe );
if( opcRe == 1 ){
super.b = '+';
escribir_archivo(ptrFile, &super, tamStructSuper, registros);
contarReg = 1;
}
break;
case 3 :
break;
case 4 :
break;
case 5 :
consultation( ptrFile, &super, tamStructSuper );
contarReg = 1;
break;
case 6 :
break;
case 7 :
break;
}
}

fclose( ptrFile );
return 0;
}

void contarRegistros( FILE *ptrFile, Super *super, int *registros, int tamStructSuper ){
fseek( ptrFile, 0, SEEK_END );
*registros =  ftell( ptrFile ) / tamStructSuper;
}

void rellenar_estructura(FILE *ptrFile, Super *super, int *opcRe){
int ch, ok;
char *p = NULL;

time_t tiempo = time(0);
struct tm *tlocal = localtime(&tiempo);
char fecha[11];
strftime(fecha,11,"%d/%m/%Y", tlocal);

printf( "\n ================== Agregar operaci%cn ==================", 162 );

do{
printf( "\n\n Ingrese fecha (formato ==> %s..................: ", fecha );
fgets(super->fecha, 11, stdin);
if((p=strchr(super->fecha, '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}
ok = strlen(super->fecha);
if( ok != 10 || super->fecha[2] != '/' || super->fecha[5] != '/'){
ok = 0;
}
}while(ok !=10);

do{
printf( "\n Ingrese importe gastado en verduler%ca (0 = sin gasto)..: ", 161 );
ok = scanf( "%f", &super->verduras) == 1 && super->verduras >= 0;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

do{
printf( "\n Ingrese importe gastado en almac%cn (0 = sin gasto).....: ", 130 );
ok = scanf( "%f", &super->almacen) == 1 && super->almacen >= 0;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

printf( "\n Ingrese recordatorio (m%cximo 100 caracteres)...........: ", 160 );
fgets(super->nota, 101, stdin);
if((p=strchr(super->nota, '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

printf( "\n =============== Grabar en base de datos ===============" );
printf( "\n 1 - Graba" );
printf( "\n 2 - Descarta" );
do{
printf( "\n\n Ingrese opci%cn.....: ", 162 );
ok = scanf( "%d", opcRe) == 1 && *opcRe >= 1 && *opcRe <= 2; 
while((ch = getchar()) !='\n' && ch!=EOF);
}while(!ok);
}

void escribir_archivo( FILE *ptrFile, Super *super, int tamStructSuper, int registros ){
super->orden = registros + 1;
fseek( ptrFile, 0, SEEK_END );
fwrite( super, tamStructSuper, 1, ptrFile );
}

void leer_archivo( FILE *ptrFile, Super *super, int registros, int cualLeer, int tamStructSuper ){
float total = 0.0;
printf( "\n\n =======================================================" );
printf( " \n\n  Fecha        Verduler%ca    Almac%cn     Total", 161, 130 );

if(cualLeer == 1){
rewind( ptrFile);
while( fread( super, tamStructSuper, 1, ptrFile ) == 1 ){
if( super->orden == registros){
fread( super, tamStructSuper, 1, ptrFile );
}
}
}
total = super->verduras + super->almacen;
printf( "\n %11s %12.2f %10.2f %9.2f (total movimientos..: %d)", super->fecha,  super->verduras, super->almacen, total, registros );
printf( "\n\n =======================================================" );
}

void buscar(FILE *ptrFile, Super *super, int tamStructSuper, int *contarReg, int *cualLeer){
char pBuscar[11], *p = NULL;
int ch, ok, opcion;

do{
printf( "\n\n Ingrese fecha a buscar (formato ==> 11/04/2015)....: " );
fgets(pBuscar, 11, stdin);
if((p=strchr(pBuscar, '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}
ok = strlen(pBuscar);
if( ok != 10 || pBuscar[2] != '/' || pBuscar[5] != '/'){
ok = 0;
}
}while(!ok);

ok=0;
rewind( ptrFile);
while( fread( super, tamStructSuper, 1, ptrFile ) == 1 ){
if( strstr(pBuscar, super->fecha) != NULL){
ok++;
opcion = resBusqueda( super );
if( opcion == 1 ){
*contarReg = 1;
*cualLeer = 2;
}
else if( opcion == 3 ){
*contarReg = 1;
*cualLeer = 1;
}
break;
}
}
if( ok == 0){
printf( "\n\n No existe..." );
MENSAJE;
}
}

int resBusqueda( Super *super ){
float totalBus;
int opcionEnc, ch, ok;

printf( "\n\n =======================================================" );
printf( " \n\n  Fecha        Verduler%ca    Almac%cn     Total", 161, 130 );

totalBus = super->verduras + super->almacen;
printf( "\n %11s %12.2f %10.2f %9.2f", super->fecha,  super->verduras, super->almacen, totalBus);

do{
printf( "\n\n ===== Opciones de lo encontrado =====" );
printf( "\n\n  1 - Encontrado" );
printf( "\n  2 - Continuar..." );
printf( "\n  3 - Finalizar" );
printf( "\n\n Ingrese opci%cn.....: ", 162 );
ok = scanf( "%d", &opcionEnc) == 1 && opcionEnc >= 1 && opcionEnc <= 3;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

return opcionEnc;
}

void consultation(FILE *ptrFile, Super *super, int tamStructSuper){
Fecha inicio;
Fecha final;
Fecha consulta;
int ok, vFecha, ch, totalDias=0;
float totalVer = 0.00, totalAlm = 0.00, subTotal = 0.00, totalCon = 0.00;

printf( "\n\n Ingrese INICIO de la consulta (formato ==> 11/04/2015)....: " );
scanf("%d/%d/%d", &inicio.dia, &inicio.mes, &inicio.año);
while ((ch = getchar()) != EOF && ch != '\n');

printf( "\n\n Ingrese FINAL de la consulta (formato ==> 11/04/2015).....: " );
scanf("%d/%d/%d", &final.dia, &final.mes, &final.año);
while ((ch = getchar()) != EOF && ch != '\n');

printf( "\n\n =======================================================" );
printf( " \n\n Fecha        Verduler%ca    Almac%cn     Total", 161, 130 );

ok=0;
rewind( ptrFile);
while( fread( super, tamStructSuper, 1, ptrFile ) == 1 ){
sscanf( super->fecha, "%d/%d/%d", &consulta.dia, &consulta.mes, &consulta.año );
vFecha = validarFechas( inicio , final, consulta );
if( vFecha == 1 ){
ok++;
totalVer += super->verduras;
totalAlm += super->almacen;
subTotal = super->almacen + super->verduras;
totalCon += subTotal;
printf( "\n%11s %12.2f %10.2f %9.2f", super->fecha,  super->verduras, super->almacen, subTotal);
}
}
if( ok > 0 ){
feDiDi( inicio, final, &totalDias );
printf( "\n\n Totales %15.2f%11.2f%10.2f", totalVer, totalAlm, totalCon);
}else{
printf( "\n\n No  hay movimientos..." );
}
MENSAJE;
}

int validarFechas(  Fecha inicio, Fecha final, Fecha consulta ){
unsigned long _inicio = (inicio.año * 365) + (inicio.mes * 28) + inicio.dia;
unsigned long fin = (final.año * 365) + (final.mes * 28) + final.dia;
unsigned long fecha = (consulta.año * 365) + (consulta.mes * 28) + consulta.dia;
   
if( fecha >= _inicio && fecha <= fin ){
        return 1;
    }else{
        return 0;
    }
}



int numeroBisiestos( int año );

void feDiDi( Fecha inicio, Fecha final, int *totalDias ){
int totalDiasAnio[] = {00,31,59,90,120,151,181,212,243,273,304,334,365};
int difAnio=0, i;

difAnio = final.año - inicio.año;

if( difAnio == 0){
*totalDias += (totalDiasAnio[final.mes-1] + final.dia) - (totalDiasAnio[inicio.mes-1] + inicio.dia);
if( inicio.mes <= 2 && final.mes > 2) {*totalDias += numeroBisiestos(inicio.año);}
}
else{
*totalDias += 365 - (totalDiasAnio[inicio.mes-1] + inicio.dia);
if( inicio.mes < 3) {*totalDias += numeroBisiestos(inicio.año);}

for( i= inicio.año +1; i< final.año; i++ ){
*totalDias += 365 + numeroBisiestos(i);
}

*totalDias += totalDiasAnio[final.mes-1] + final.dia;
if( final.mes > 2) {*totalDias += numeroBisiestos(final.año);}
}
}

int numeroBisiestos( int año ){
if((año %4 == 0 && año%100 != 0) || (año%400) == 0){return 1;}
else{return 0;}
}

Es todo y espero como siempre de vuestra ayuda.-

Saludos.
Daniel   
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

ivancea96

¿Qué es el segundo archivo? Da alguna información. Si no está definida la estructura "Fecha" en un código no la podrás usar.

DanielPy

Hola.
El segundo archivo es para establecer la diferencia en días de la consulta (Fecha inicio y Fecha final), lo que no entiendo es porque no me da error en la variable *totalDias y si en la estructuras Fechas,  yo creí que al incluirlo en el archivo que tiene la función principal debería funcionar.-
Bueno no tengo más que aportar, espero que me digas si te surge alguna idea más del porqué del error.-   

Saludos.
Daniel   
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Cita de: DanielC# en 11 Mayo 2015, 19:33 PMEstoy aprendiendo a modular código en c y en el código que les dejo a continuación me da el siguiente error. Error: nombre de tipo desconocido 'Fecha', en las líneas 3:14 y 3:28.-
El error se genera porque el uso (1) del tipo "Fecha" aparece antes que su declaración (2):
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include "fechaDifDias.c" /* (1) Uso del tipo Fecha */

#define MENSAJE printf( "\n\n Pulse [Enter] para continuar..." ); getchar();

typedef struct{
int orden;
char b;
char fecha[11];
float verduras;
float almacen;
char nota[101];
}Super;

typedef struct{
int dia;
int mes;
int año;
}Fecha;  /* (2) Declaracion del tipo Fecha */

Para solucionarlo basta con cambiar el orden: primero la declaración y después su uso.

Con todo no se recomienda incluir mediante directiva del preprocesador una unidad (extensión ".c") ya que pueden generarse otros errores como la definición múltiple de una función. Hay algunos temas sobre programación modular en la base de datos de los foros, los puedes consultar mediante el motor de búsqueda.

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

DanielPy

Hola.
Funciona a la perfección, muchas gracias.-
CitarCon todo no se recomienda incluir mediante directiva del preprocesador una unidad (extensión ".c") ya que pueden generarse otros errores como la definición múltiple de una función. Hay algunos temas sobre programación modular en la base de datos de los foros, los puedes consultar mediante el motor de búsqueda.
Ya me pongo a documentarme sobre el tema.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-