elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar estructura a archivo distinto del que contiene la función main[C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pasar estructura a archivo distinto del que contiene la función main[C]  (Leído 2,233 veces)
DanielPy

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Pasar estructura a archivo distinto del que contiene la función main[C]
« 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   


En línea

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


Desconectado Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: Pasar estructura a archivo distinto del que contiene la función main[C]
« Respuesta #1 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.


En línea

DanielPy

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Pasar estructura a archivo distinto del que contiene la función main[C]
« Respuesta #2 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   
En línea

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Pasar estructura a archivo distinto del que contiene la función main[C]
« Respuesta #3 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
En línea

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

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Pasar estructura a archivo distinto del que contiene la función main[C]
« Respuesta #4 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
En línea

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.-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines