Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DanielPy en 11 Mayo 2015, 19:33 pm



Título: Pasar estructura a archivo distinto del que contiene la función main[C]
Publicado por: DanielPy en 11 Mayo 2015, 19:33 pm
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.-

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <time.h>
  4. #include "fechaDifDias.c"
  5.  
  6. #define MENSAJE printf( "\n\n Pulse [Enter] para continuar..." ); getchar();
  7.  
  8. typedef struct{
  9. int orden;
  10. char b;
  11. char fecha[11];
  12. float verduras;
  13. float almacen;
  14. char nota[101];
  15. }Super;
  16.  
  17. typedef struct{
  18. int dia;
  19. int mes;
  20. int año;
  21. }Fecha;
  22.  
  23. int mainMenu(void);
  24. void contarRegistros( FILE *ptrFile, Super *super, int *registros, int tamStructSuper );
  25. void rellenar_estructura(FILE *ptrFile, Super *super, int *opcRe);
  26. void escribir_archivo(FILE *ptrFile, Super *super, int tamStructSuper, int registros);
  27. void leer_archivo(FILE *ptrFile, Super *super, int registros, int cualLeer, int tamStructSuper);
  28. void buscar(FILE *ptrFile, Super *super, int tamStructSuper, int *contarReg, int *cualLeer);
  29. int resBusqueda(Super *super);
  30. void consultation(FILE *ptrFile, Super *super, int tamStructSuper);
  31. int validarFechas(  Fecha inicio, Fecha final, Fecha consulta );
  32. void feDiDi( Fecha inicio, Fecha final, int *totalDias );
  33.  
  34. int main(void){
  35. mainMenu();
  36.  
  37. return 0;
  38. }
  39.  
  40.  
  41. int mainMenu(void){
  42. Super super = {0};
  43. int ok, ch, opcMp, registros, contarReg=1, cualLeer=1, opcRe;
  44. int tamStructSuper = sizeof(int) + sizeof(char) + (sizeof(char)*11) + sizeof(float) + sizeof(float) + (sizeof(char)*101);
  45.  
  46. FILE *ptrFile;
  47. if(( ptrFile = fopen( "gastos.txt", "ab+" ) ) == NULL){
  48. perror( "\n\n error" );
  49. return 1;
  50. }
  51.  
  52. while( opcMp != 8){
  53. do{
  54. system( "cls" );
  55.  
  56. if( contarReg == 1 ){
  57. contarRegistros( ptrFile, &super, &registros, tamStructSuper );
  58. leer_archivo( ptrFile, &super, registros, cualLeer , tamStructSuper);
  59. contarReg = 0;
  60. cualLeer = 1;
  61. }
  62.  
  63. printf( "\n\n ========== Men%c principal ===========", 163 );
  64.  
  65. printf( "\n\n 1 - Buscar" );
  66. printf( "\n 2 - Agregar" );
  67. printf( "\n 3 - Modificar" );
  68. printf( "\n 4 - Borrar" );
  69. printf( "\n 5 - Consulta" );
  70. printf( "\n 6 - Marcados para borrar" );
  71. printf( "\n 7 - Empaquetar tabla" );
  72. printf( "\n 8 - Finalizar" );
  73.  
  74. printf( "\n\n Ingrese opci%cn.....: ", 162 );
  75. ok = scanf( "%d", &opcMp) == 1 && opcMp >=1 && opcMp <=8;
  76. while ((ch = getchar()) != EOF && ch != '\n');
  77. }while(!ok);
  78.  
  79. switch(opcMp){
  80. case 1 :
  81. if( registros >= 1){
  82. buscar(ptrFile, &super, tamStructSuper, &contarReg, &cualLeer);
  83. }else{
  84. printf( "\n\n No tiene ningun movimiento grabado" );
  85. MENSAJE;
  86. }
  87. break;
  88. case 2 :
  89. rellenar_estructura( ptrFile, &super, &opcRe );
  90. if( opcRe == 1 ){
  91. super.b = '+';
  92. escribir_archivo(ptrFile, &super, tamStructSuper, registros);
  93. contarReg = 1;
  94. }
  95. break;
  96. case 3 :
  97. break;
  98. case 4 :
  99. break;
  100. case 5 :
  101. consultation( ptrFile, &super, tamStructSuper );
  102. contarReg = 1;
  103. break;
  104. case 6 :
  105. break;
  106. case 7 :
  107. break;
  108. }
  109. }
  110.  
  111. fclose( ptrFile );
  112. return 0;
  113. }
  114.  
  115. void contarRegistros( FILE *ptrFile, Super *super, int *registros, int tamStructSuper ){
  116. fseek( ptrFile, 0, SEEK_END );
  117. *registros =  ftell( ptrFile ) / tamStructSuper;
  118. }
  119.  
  120. void rellenar_estructura(FILE *ptrFile, Super *super, int *opcRe){
  121. int ch, ok;
  122. char *p = NULL;
  123.  
  124. time_t tiempo = time(0);
  125. struct tm *tlocal = localtime(&tiempo);
  126. char fecha[11];
  127. strftime(fecha,11,"%d/%m/%Y", tlocal);
  128.  
  129. printf( "\n ================== Agregar operaci%cn ==================", 162 );
  130.  
  131. do{
  132. printf( "\n\n Ingrese fecha (formato ==> %s..................: ", fecha );
  133. fgets(super->fecha, 11, stdin);
  134. if((p=strchr(super->fecha, '\n'))){
  135. *p='\0';
  136. }
  137. else{
  138. while((ch = getchar()) !='\n' && ch!=EOF);
  139. }
  140. ok = strlen(super->fecha);
  141. if( ok != 10 || super->fecha[2] != '/' || super->fecha[5] != '/'){
  142. ok = 0;
  143. }
  144. }while(ok !=10);
  145.  
  146. do{
  147. printf( "\n Ingrese importe gastado en verduler%ca (0 = sin gasto)..: ", 161 );
  148. ok = scanf( "%f", &super->verduras) == 1 && super->verduras >= 0;
  149. while ((ch = getchar()) != EOF && ch != '\n');
  150. }while(!ok);
  151.  
  152. do{
  153. printf( "\n Ingrese importe gastado en almac%cn (0 = sin gasto).....: ", 130 );
  154. ok = scanf( "%f", &super->almacen) == 1 && super->almacen >= 0;
  155. while ((ch = getchar()) != EOF && ch != '\n');
  156. }while(!ok);
  157.  
  158. printf( "\n Ingrese recordatorio (m%cximo 100 caracteres)...........: ", 160 );
  159. fgets(super->nota, 101, stdin);
  160. if((p=strchr(super->nota, '\n'))){
  161. *p='\0';
  162. }
  163. else{
  164. while((ch = getchar()) !='\n' && ch!=EOF);
  165. }
  166.  
  167. printf( "\n =============== Grabar en base de datos ===============" );
  168. printf( "\n 1 - Graba" );
  169. printf( "\n 2 - Descarta" );
  170. do{
  171. printf( "\n\n Ingrese opci%cn.....: ", 162 );
  172. ok = scanf( "%d", opcRe) == 1 && *opcRe >= 1 && *opcRe <= 2;  
  173. while((ch = getchar()) !='\n' && ch!=EOF);
  174. }while(!ok);
  175. }
  176.  
  177. void escribir_archivo( FILE *ptrFile, Super *super, int tamStructSuper, int registros ){
  178. super->orden = registros + 1;
  179. fseek( ptrFile, 0, SEEK_END );
  180. fwrite( super, tamStructSuper, 1, ptrFile );
  181. }
  182.  
  183. void leer_archivo( FILE *ptrFile, Super *super, int registros, int cualLeer, int tamStructSuper ){
  184. float total = 0.0;
  185. printf( "\n\n =======================================================" );
  186. printf( " \n\n  Fecha        Verduler%ca    Almac%cn     Total", 161, 130 );
  187.  
  188. if(cualLeer == 1){
  189. rewind( ptrFile);
  190. while( fread( super, tamStructSuper, 1, ptrFile ) == 1 ){
  191. if( super->orden == registros){
  192. fread( super, tamStructSuper, 1, ptrFile );
  193. }
  194. }
  195. }
  196. total = super->verduras + super->almacen;
  197. printf( "\n %11s %12.2f %10.2f %9.2f (total movimientos..: %d)", super->fecha,  super->verduras, super->almacen, total, registros );
  198. printf( "\n\n =======================================================" );
  199. }
  200.  
  201. void buscar(FILE *ptrFile, Super *super, int tamStructSuper, int *contarReg, int *cualLeer){
  202. char pBuscar[11], *p = NULL;
  203. int ch, ok, opcion;
  204.  
  205. do{
  206. printf( "\n\n Ingrese fecha a buscar (formato ==> 11/04/2015)....: " );
  207. fgets(pBuscar, 11, stdin);
  208. if((p=strchr(pBuscar, '\n'))){
  209. *p='\0';
  210. }
  211. else{
  212. while((ch = getchar()) !='\n' && ch!=EOF);
  213. }
  214. ok = strlen(pBuscar);
  215. if( ok != 10 || pBuscar[2] != '/' || pBuscar[5] != '/'){
  216. ok = 0;
  217. }
  218. }while(!ok);
  219.  
  220. ok=0;
  221. rewind( ptrFile);
  222. while( fread( super, tamStructSuper, 1, ptrFile ) == 1 ){
  223. if( strstr(pBuscar, super->fecha) != NULL){
  224. ok++;
  225. opcion = resBusqueda( super );
  226. if( opcion == 1 ){
  227. *contarReg = 1;
  228. *cualLeer = 2;
  229. }
  230. else if( opcion == 3 ){
  231. *contarReg = 1;
  232. *cualLeer = 1;
  233. }
  234. break;
  235. }
  236. }
  237. if( ok == 0){
  238. printf( "\n\n No existe..." );
  239. MENSAJE;
  240. }
  241. }
  242.  
  243. int resBusqueda( Super *super ){
  244. float totalBus;
  245. int opcionEnc, ch, ok;
  246.  
  247. printf( "\n\n =======================================================" );
  248. printf( " \n\n  Fecha        Verduler%ca    Almac%cn     Total", 161, 130 );
  249.  
  250. totalBus = super->verduras + super->almacen;
  251. printf( "\n %11s %12.2f %10.2f %9.2f", super->fecha,  super->verduras, super->almacen, totalBus);
  252.  
  253. do{
  254. printf( "\n\n ===== Opciones de lo encontrado =====" );
  255. printf( "\n\n  1 - Encontrado" );
  256. printf( "\n  2 - Continuar..." );
  257. printf( "\n  3 - Finalizar" );
  258. printf( "\n\n Ingrese opci%cn.....: ", 162 );
  259. ok = scanf( "%d", &opcionEnc) == 1 && opcionEnc >= 1 && opcionEnc <= 3;
  260. while ((ch = getchar()) != EOF && ch != '\n');
  261. }while(!ok);
  262.  
  263. return opcionEnc;
  264. }
  265.  
  266. void consultation(FILE *ptrFile, Super *super, int tamStructSuper){
  267. Fecha inicio;
  268. Fecha final;
  269. Fecha consulta;
  270. int ok, vFecha, ch, totalDias=0;
  271. float totalVer = 0.00, totalAlm = 0.00, subTotal = 0.00, totalCon = 0.00;
  272.  
  273. printf( "\n\n Ingrese INICIO de la consulta (formato ==> 11/04/2015)....: " );
  274. scanf("%d/%d/%d", &inicio.dia, &inicio.mes, &inicio.año);
  275. while ((ch = getchar()) != EOF && ch != '\n');
  276.  
  277. printf( "\n\n Ingrese FINAL de la consulta (formato ==> 11/04/2015).....: " );
  278. scanf("%d/%d/%d", &final.dia, &final.mes, &final.año);
  279. while ((ch = getchar()) != EOF && ch != '\n');
  280.  
  281. printf( "\n\n =======================================================" );
  282. printf( " \n\n Fecha        Verduler%ca    Almac%cn     Total", 161, 130 );
  283.  
  284. ok=0;
  285. rewind( ptrFile);
  286. while( fread( super, tamStructSuper, 1, ptrFile ) == 1 ){
  287. sscanf( super->fecha, "%d/%d/%d", &consulta.dia, &consulta.mes, &consulta.año );
  288. vFecha = validarFechas( inicio , final, consulta );
  289. if( vFecha == 1 ){
  290. ok++;
  291. totalVer += super->verduras;
  292. totalAlm += super->almacen;
  293. subTotal = super->almacen + super->verduras;
  294. totalCon += subTotal;
  295. printf( "\n%11s %12.2f %10.2f %9.2f", super->fecha,  super->verduras, super->almacen, subTotal);
  296. }
  297. }
  298. if( ok > 0 ){
  299. feDiDi( inicio, final, &totalDias );
  300. printf( "\n\n Totales %15.2f%11.2f%10.2f", totalVer, totalAlm, totalCon);
  301. }else{
  302. printf( "\n\n No  hay movimientos..." );
  303. }
  304. MENSAJE;
  305. }
  306.  
  307. int validarFechas(  Fecha inicio, Fecha final, Fecha consulta ){
  308. unsigned long _inicio = (inicio.año * 365) + (inicio.mes * 28) + inicio.dia;
  309. unsigned long fin = (final.año * 365) + (final.mes * 28) + final.dia;
  310. unsigned long fecha = (consulta.año * 365) + (consulta.mes * 28) + consulta.dia;
  311.  
  312. if( fecha >= _inicio && fecha <= fin ){
  313.        return 1;
  314.    }else{
  315.        return 0;
  316.    }
  317. }


Código
  1. int numeroBisiestos( int año );
  2.  
  3. void feDiDi( Fecha inicio, Fecha final, int *totalDias ){
  4. int totalDiasAnio[] = {00,31,59,90,120,151,181,212,243,273,304,334,365};
  5. int difAnio=0, i;
  6.  
  7. difAnio = final.año - inicio.año;
  8.  
  9. if( difAnio == 0){
  10. *totalDias += (totalDiasAnio[final.mes-1] + final.dia) - (totalDiasAnio[inicio.mes-1] + inicio.dia);
  11. if( inicio.mes <= 2 && final.mes > 2) {*totalDias += numeroBisiestos(inicio.año);}
  12. }
  13. else{
  14. *totalDias += 365 - (totalDiasAnio[inicio.mes-1] + inicio.dia);
  15. if( inicio.mes < 3) {*totalDias += numeroBisiestos(inicio.año);}
  16.  
  17. for( i= inicio.año +1; i< final.año; i++ ){
  18. *totalDias += 365 + numeroBisiestos(i);
  19. }
  20.  
  21. *totalDias += totalDiasAnio[final.mes-1] + final.dia;
  22. if( final.mes > 2) {*totalDias += numeroBisiestos(final.año);}
  23. }
  24. }
  25.  
  26. int numeroBisiestos( int año ){
  27. if((año %4 == 0 && año%100 != 0) || (año%400) == 0){return 1;}
  28. else{return 0;}
  29. }
Es todo y espero como siempre de vuestra ayuda.-

Saludos.
Daniel   


Título: Re: Pasar estructura a archivo distinto del que contiene la función main[C]
Publicado por: ivancea96 en 11 Mayo 2015, 22:21 pm
¿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.


Título: Re: Pasar estructura a archivo distinto del que contiene la función main[C]
Publicado por: DanielPy en 11 Mayo 2015, 23:40 pm
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   


Título: Re: Pasar estructura a archivo distinto del que contiene la función main[C]
Publicado por: rir3760 en 12 Mayo 2015, 03:22 am
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.-
El error se genera porque el uso (1) del tipo "Fecha" aparece antes que su declaración (2):
Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <time.h>
  4. #include "fechaDifDias.c" /* (1) Uso del tipo Fecha */
  5.  
  6. #define MENSAJE printf( "\n\n Pulse [Enter] para continuar..." ); getchar();
  7.  
  8. typedef struct{
  9. int orden;
  10. char b;
  11. char fecha[11];
  12. float verduras;
  13. float almacen;
  14. char nota[101];
  15. }Super;
  16.  
  17. typedef struct{
  18. int dia;
  19. int mes;
  20. int año;
  21. }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


Título: Re: Pasar estructura a archivo distinto del que contiene la función main[C]
Publicado por: DanielPy en 12 Mayo 2015, 04:11 am
Hola.
Funciona a la perfección, muchas gracias.-
Citar
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.
Ya me pongo a documentarme sobre el tema.-

Saludos.
Daniel