Estoy aprendiendo a modular programas, el caso es que me da el siguiente error. Error: nombre de tipo desconocido ‘Fecha’, en las líneas 3:14 y 3:28.-
No sé porque me ocurre dado que la variable *totalDias la toma correctamente.-
Es todo lo que puedo aportar por el momento.-
#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 anio;
}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, ®istros, 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.anio);
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.anio);
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.anio );
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.anio * 365) + (inicio.mes * 28) + inicio.dia;
unsigned long fin = (final.anio * 365) + (final.mes * 28) + final.dia;
unsigned long fecha = (consulta.anio * 365) + (consulta.mes * 28) + consulta.dia;
if( fecha >= _inicio && fecha <= fin ){
return 1;
}else{
return 0;
}
}
int numeroBisiestos( int anio );
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.anio - inicio.anio;
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.anio);}
}
else{
*totalDias += 365 - (totalDiasAnio[inicio.mes-1] + inicio.dia);
if( inicio.mes < 3) {*totalDias += numeroBisiestos(inicio.anio);}
for( i= inicio.anio +1; i< final.anio; i++ ){
*totalDias += 365 + numeroBisiestos(i);
}
*totalDias += totalDiasAnio[final.mes-1] + final.dia;
if( final.mes > 2) {*totalDias += numeroBisiestos(final.anio);}
}
}
int numeroBisiestos( int anio ){
if((anio %4 == 0 && anio%100 != 0) || (anio%400) == 0){return 1;}
else{return 0;}
}
Desde ya muchas gracia por el tiempo que le dediquen al tema.-Daniel