Annotation of ADD_ver_10/Source Code/Source Files/Ficheros.c, revision 1.2
1.2 ! rico 1: /********************************************************************/
! 2: /* Ficheros.c */
! 3: /* */
! 4: /* */
! 5: /* Copyright (c) 1997-2006 Rafael Rico (rafael.rico@uah.es) */
! 6: /* */
! 7: /* Este fichero forma parte de ADD */
! 8: /* (Analizador de Dependencias de Datos) */
! 9: /* Version 5.10. */
! 10: /* */
! 11: /* */
! 12: /* ADD es software libre. Puede redistribuirlo y/o modificarlo */
! 13: /* bajo los términos de la Licencia Pública General de GNU */
! 14: /* según es publicada por la Free Software Foundation, bien bajo */
! 15: /* la versión 2 de dicha Licencia o bien (según su elección) */
! 16: /* bajo cualquier versión posterior. */
! 17: /* */
! 18: /* ADD se distribuye con la esperanza de que sea útil, */
! 19: /* pero SIN NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL */
! 20: /* implícita y sin garantizar la CONVENIENCIA PARA UN PROPÓSITO */
! 21: /* PARTICULAR. Véase la Licencia Pública General de GNU para */
! 22: /* más detalles. */
! 23: /* */
! 24: /* Debería haber recibido una copia de la Licencia Pública General */
! 25: /* junto con ADD. Si no ha sido así, escriba a la Free Software */
! 26: /* Foundation, Inc., 51 Franklin St, Fifth Floor, */
! 27: /* Boston, MA 02110-1301 EEUU. */
! 28: /* */
! 29: /* -------------------------- Historia --------------------------- */
! 30: /* */
! 31: /* $Id$ */
! 32: /* */
! 33: /* Revisión 1.2. 01/2006 */
! 34: /* Se añade la licencia GPL y documentación en estilo Javadoc */
! 35: /* */
! 36: /* Revisión 1.1. 09/2005 */
! 37: /* Versión inicial */
! 38: /* */
! 39: /********************************************************************/
! 40:
1.1 rico 41: /******************************************************************************/
42: /* MÓDULO: Ficheros.c */
43: /* */
44: /* Este módulo contiene las funciones relacionadas con el almacenamiento de */
45: /* información en ficheros. */
46: /******************************************************************************/
47: /* Fecha: 23 de septiembre de 2005 */
48: /******************************************************************************/
49:
50: #include <stdio.h>
51: #include <string.h>
52: #include <time.h>
53:
54: #include "defines.h"
55: #include "tipos.h"
56: #include "ficheros.h"
57:
58: /* configuración */
59: extern struct argumentos configuracion;
60:
61: /* bases de datos */
62: extern unsigned int num_nemonicos;
63: extern operacion *nemonicos;
64: extern unsigned int num_simbolos;
65: extern operando *simbolos;
66:
67: extern unsigned int num_tiempos;
68: extern tiempo *ciclos;
69:
70: /* recuentos */
71: extern unsigned long int *contadornemonicos;
72: extern unsigned long int *contadorlecturas;
73: extern unsigned long int *contadorescrituras;
74:
75: /* contadores de instrucciones y ventanas */
76: extern unsigned long instruccion, ventana;
77:
78: /* otros resultados */
79: extern double cpimedio;
80: extern double tiempoejecucion;
81: extern unsigned long *distribucionpasos;
82:
83: /* posibles ubicaciones de datos */
84: extern unsigned int num_ubicaciones;
85: extern ubicacion *datos;
86:
87: /* analisis de dependencias de datos */
88: extern struct punterosD matriz;
89: extern unsigned char **matrizC;
90: extern char **OrdenParcial;
91:
92: /* parámetros asociados a las matrices */
93: extern parametromatriz *pasos;
94: extern parametromatriz *mediapasos;
95: extern parametromatriz *grado;
96: extern parametromatriz *mediagrado;
97: extern parametromatriz *acoplo;
98: extern parametromatriz *mediaacoplo;
99:
100:
101:
102: /* BASES de DATOS */
103: /* función para salvar en un fichero la base de datos */
104:
105: void CrearFicheroDB (char *fichero, int idtabla)
106: {
107: FILE *handle;
108: unsigned int i;
109: char mensaje[MAX_LINE];
110:
111: /* los ficheros van a tener el formato de texto EXCEL */
112: /* al nombre del fichero le asigno la extensión .XLS */
113:
114: strcat(fichero, ".xls");
115:
116: switch(idtabla)
117: {
118: case TABLA_NEMONICOS:
119: /* abro el fichero */
120: if((handle = fopen(fichero, "w")) != NULL)
121: {
122: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' se ha abierto con éxito", fichero);
123: Notificar(mensaje, NO_ERROR, ECO_NO);
124:
125: /* escribo una pequeña cabecera */
126: fprintf(handle, "BASE DE DATOS DE NEMÓNICOS\n\n");
127: fprintf(handle, "%s\t", "índice");
128: fprintf(handle, "%s\t", "nemónico");
129: fprintf(handle, "%s\t", "tipo");
130: fprintf(handle, "%s\t", "implicitos_escritos");
131: fprintf(handle, "%s\t", "implicitos_leidos");
132: fprintf(handle, "%s\t", "modo_op1");
133: fprintf(handle, "%s\n", "modo_op2");
134: /* fprintf(handle, "%s\n", "cuenta"); */
135:
136: /* copio la base de datos al fichero con formato EXCEL */
137: for(i=0; i<num_nemonicos; i++)
138: {
139: fprintf(handle, "%d\t%s\t", i+1, nemonicos[i].nemonico);
140: fprintf(handle, "%d\t", nemonicos[i].tipo);
141: fprintf(handle, "%s\t", nemonicos[i].implicitos_escritos);
142: fprintf(handle, "%s\t", nemonicos[i].implicitos_leidos);
143: fprintf(handle, "%d\t", nemonicos[i].modo_op1);
144: fprintf(handle, "%d\n", nemonicos[i].modo_op2);
145: /* fprintf(handle, "%lu\n", nemonicos[i].cuenta); */
146: }
147:
148: sprintf(mensaje, "[CrearFicheroDB] La Tabla Nemónicos se ha volcado al fichero '%s'", fichero);
149: Notificar(mensaje, NO_ERROR, ECO_NO);
150:
151: /* cierro el fichero */
152: if(fclose(handle))
153: {
154: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' no se ha podido cerrar", fichero);
155: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
156: }
157: else
158: {
159: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' ha sido cerrado con éxito", fichero);
160: Notificar(mensaje, NO_ERROR, ECO_NO);
161: }
162: }
163: else
164: {
165: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' no se ha podido abrir", fichero);
166: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
167: }
168: break;
169:
170: case TABLA_SIMBOLOS:
171: /* abro el fichero */
172: if((handle = fopen(fichero, "w")) != NULL)
173: {
174: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' se ha abierto con éxito", fichero);
175: Notificar(mensaje, NO_ERROR, ECO_NO);
176:
177: /* escribo una pequeña cabecera */
178: fprintf(handle, "BASE DE DATOS DE UBICACIONES\n\n");
179: fprintf(handle, "%s\t", "índice");
180: fprintf(handle, "%s\t", "símbolo");
181: fprintf(handle, "%s\t", "tipo");
182: fprintf(handle, "%s\t", "dependencias");
183: fprintf(handle, "%s\n", "segmento");
184: /* fprintf(handle, "%s\t", "lecturas"); */
185: /* fprintf(handle, "%s\n", "escrituras"); */
186:
187: /* copio la base de datos al fichero con formato EXCEL */
188: for(i=0; i<num_simbolos; i++)
189: {
190: fprintf(handle, "%d\t%s\t", i+1, simbolos[i].simbolo);
191: fprintf(handle, "%d\t", simbolos[i].tipo);
192: fprintf(handle, "%s\t", simbolos[i].dependencias);
193: fprintf(handle, "%d\n", simbolos[i].segmento);
194: /* fprintf(handle, "%lu\t", simbolos[i].lecturas); */
195: /* fprintf(handle, "%lu\n", simbolos[i].escrituras); */
196: }
197:
198: sprintf(mensaje, "[CrearFicheroDB] La Tabla Símbolos se ha volcado al fichero '%s'", fichero);
199: Notificar(mensaje, NO_ERROR, ECO_NO);
200:
201: /* cierro el fichero */
202: if(fclose(handle))
203: {
204: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' no se ha podido cerrar", fichero);
205: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
206: }
207: else
208: {
209: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' ha sido cerrado con éxito", fichero);
210: Notificar(mensaje, NO_ERROR, ECO_NO);
211: }
212: }
213: else
214: {
215: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' no se ha podido abrir", fichero);
216: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
217: }
218: break;
219:
220: case TABLA_CICLOS:
221: /* abro el fichero */
222: if((handle = fopen(fichero, "w")) != NULL)
223: {
224: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' se ha abierto con éxito", fichero);
225: Notificar(mensaje, NO_ERROR, ECO_NO);
226:
227: /* escribo una pequeña cabecera */
228: fprintf(handle, "BASE DE DATOS DE TIEMPOS DE EJECUCIÓN\n\n");
229: fprintf(handle, "%s\t", "índice");
230: fprintf(handle, "%s\t", "identificador");
231: fprintf(handle, "%s\n", "ciclos");
232:
233: /* copio la base de datos al fichero con formato EXCEL */
234: for(i=0; i<num_tiempos; i++)
235: {
236: fprintf(handle, "%d\t%s\t", i+1, ciclos[i].identificador);
237: fprintf(handle, "%d\n", ciclos[i].ciclos);
238: }
239:
240: sprintf(mensaje, "[CrearFicheroDB] La Tabla Ciclos se ha volcado al fichero '%s'", fichero);
241: Notificar(mensaje, NO_ERROR, ECO_NO);
242:
243: /* cierro el fichero */
244: if(fclose(handle))
245: {
246: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' no se ha podido cerrar", fichero);
247: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
248: }
249: else
250: {
251: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' ha sido cerrado con éxito", fichero);
252: Notificar(mensaje, NO_ERROR, ECO_NO);
253: }
254: }
255: else
256: {
257: sprintf(mensaje, "[CrearFicheroDB] El fichero '%s' no se ha podido abrir\n", fichero);
258: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
259: }
260: break;
261: }
262: }
263:
264:
265: /* esta función salva todas las bases de datos utilizadas */
266:
267: void SalvarBasesDatos()
268: {
269: char cadena[MAX_LINE];
270:
271: /* genero los ficheros con las tablas de la BD para comprobar que todo va bien */
272: strcpy(cadena, "nemos");
273: CrearFicheroDB (cadena, TABLA_NEMONICOS);
274: strcpy(cadena, "ubis");
275: CrearFicheroDB (cadena, TABLA_SIMBOLOS);
276: if(configuracion.cpi == SI)
277: {
278: strcpy(cadena, "ciclos");
279: CrearFicheroDB (cadena, TABLA_CICLOS);
280: }
281: }
282:
283:
284: /* VENTANAS de INSTRUCCIONES */
285: /* funciones para salvar en un fichero la información relativa a una ventana */
286: /* de instrucciones */
287: /* abro un fichero para salvar información de una ventana de instrucciones */
288:
289: void IniciarFicheroVentana()
290: {
291: FILE *handle;
292: char fichero[MAX_LINE];
293: char mensaje[MAX_LINE];
294: int i;
295:
296: /* el fichero va a tener el formato de texto EXCEL */
297: /* construyo el nombre a partir del número de ventana */
298: /* al nombre del fichero le asigno la extensión .XLS */
299:
300: sprintf(fichero, "%lu.xls", ventana);
301:
302: /* esto no es ANSI
303: _ltoa(ventana, fichero, 10);
304: strcat(fichero, ".xls"); */
305:
306: /* abro el fichero */
307: if((handle = fopen(fichero, "w")) != NULL)
308: {
309: sprintf(mensaje, "[IniciarFicheroVentana] El fichero '%s' se ha abierto con éxito", fichero);
310: Notificar(mensaje, NO_ERROR, ECO_NO);
311:
312: /* escribo una pequeña cabecera con información */
313: /* copiar de CrearFicheroResultados */
314:
315: fprintf(handle, "VENTANA NÚMERO:\t%lu\n\n", ventana);
316:
317: /* encabezado de la tabla */
318: fprintf(handle, "SECUENCIA DE CÓDIGO\n");
319: fprintf(handle, "\t\t\toperandos leidos\t\t\t\t\t\t\t\toperandos escritos\n");
320: fprintf(handle, "\t\t\texplícitos\t\t\t\timplícitos\t\t\t\texplícitos\t\t\t\timplícitos\n");
321:
322: fprintf(handle, "instrucción\thexadecimal\tensamblador\t");
323: for(i=0; i<4; i++) fprintf(handle, "datos\tdirecciones\tpila\testado\t");
324: fprintf(handle, "longitud\ttipo\tciclos ALU\tciclos BIU\n");
325:
326:
327: /* cierro el fichero */
328: if(fclose(handle))
329: {
330: sprintf(mensaje, "[IniciarFicheroVentana] El fichero '%s' no se ha podido cerrar", fichero);
331: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
332: }
333: else
334: {
335: sprintf(mensaje, "[IniciarFicheroVentana] El fichero '%s' ha sido cerrado con éxito", fichero);
336: Notificar(mensaje, NO_ERROR, ECO_NO);
337: }
338: }
339: else
340: {
341: sprintf(mensaje, "[IniciarFicheroVentana] El fichero '%s' no se ha podido abrir", fichero);
342: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
343: }
344: }
345:
346:
347: /* escribo información sobre una instrucción en el fichero de la ventana */
348:
349: void Instruccion2FicheroVentana(fichainstruccion *tarjetaoperandos)
350: {
351: FILE *handle;
352: char fichero[MAX_LINE];
353: char mensaje[MAX_LINE];
354:
355: /* construyo el nombre a partir del número de ventana */
356:
357: sprintf(fichero, "%lu.xls", ventana);
358:
359: /* esto no es ANSI
360: _ltoa(ventana, fichero, 10);
361: strcat(fichero, ".xls"); */
362:
363: /* abro el fichero */
364: if((handle = fopen(fichero, "a")) != NULL)
365: {
366: sprintf(mensaje, "[Instruccion2FicheroVentana] El fichero '%s' se ha abierto con éxito", fichero);
367: Notificar(mensaje, NO_ERROR, ECO_NO);
368:
369: /* escribo la información relativa a la instrucción */
370:
371: fprintf(handle, "%d\t", instruccion);
372: fprintf(handle, "%s\t", tarjetaoperandos->hexadecimal);
373:
374: /* formato de instrucción (notación de INTEL) */
375: /*
376: fprintf(handle, "%s%s", tarjetaoperandos->prefijo, tarjetaoperandos->prefijo[0]!='\0' ? " ":"");
377: fprintf(handle, "%s", tarjetaoperandos->nemonico);
378: fprintf(handle, "%s%s", tarjetaoperandos->op1[0]!='\0' ? " ":"", tarjetaoperandos->op1);
379: fprintf(handle, "%s%s%s", (tarjetaoperandos->op1[0]!='\0' && tarjetaoperandos->op2[0]!='\0') ? ",":"", tarjetaoperandos->op2[0]!='\0' ? " ":"", tarjetaoperandos->op2);
380: fprintf(handle, "\t");
381: */
382:
383: /* igual con la función del módulo 'Auxiliares.c' */
384: CadenaEnsamblador(tarjetaoperandos->prefijo, tarjetaoperandos->nemonico, tarjetaoperandos->op1, tarjetaoperandos->op2, INTEL, mensaje);
385: fprintf(handle, "%s\t", mensaje);
386:
387:
388: /* operandos */
389: fprintf(handle, "%s\t", tarjetaoperandos->leidoexpldatos);
390: fprintf(handle, "%s\t", tarjetaoperandos->leidoexpldir);
391: fprintf(handle, "%s\t", tarjetaoperandos->leidoexplpila);
392: fprintf(handle, "%s\t", tarjetaoperandos->leidoexplestado);
393: fprintf(handle, "%s\t", tarjetaoperandos->leidoimpldatos);
394: fprintf(handle, "%s\t", tarjetaoperandos->leidoimpldir);
395: fprintf(handle, "%s\t", tarjetaoperandos->leidoimplpila);
396: fprintf(handle, "%s\t", tarjetaoperandos->leidoimplestado);
397: fprintf(handle, "%s\t", tarjetaoperandos->escritoexpldatos);
398: fprintf(handle, "%s\t", tarjetaoperandos->escritoexpldir);
399: fprintf(handle, "%s\t", tarjetaoperandos->escritoexplpila);
400: fprintf(handle, "%s\t", tarjetaoperandos->escritoexplestado);
401: fprintf(handle, "%s\t", tarjetaoperandos->escritoimpldatos);
402: fprintf(handle, "%s\t", tarjetaoperandos->escritoimpldir);
403: fprintf(handle, "%s\t", tarjetaoperandos->escritoimplpila);
404: fprintf(handle, "%s\t", tarjetaoperandos->escritoimplestado);
405:
406: fprintf(handle, "%d\t", tarjetaoperandos->longitud);
407: switch(tarjetaoperandos->salto)
408: {
409: case INCONDICIONAL:
410: fprintf(handle, "INCONDICIONAL\t");
411: break;
412:
413: case NO_SALTO:
414: fprintf(handle, "NO SALTO\t");
415: break;
416:
417: case TOMADO:
418: fprintf(handle, "TOMADO\t");
419: break;
420:
421: case NOTOMADO:
422: fprintf(handle, "NO TOMADO\t");
423: break;
424: }
425:
426: fprintf(handle, "%d\t", tarjetaoperandos->ciclosALU);
427: fprintf(handle, "%d", tarjetaoperandos->ciclosBIU);
428:
429: fprintf(handle, "\n");
430:
431:
432: /* cierro el fichero */
433: if(fclose(handle))
434: {
435: sprintf(mensaje, "[Instruccion2FicheroVentana] El fichero '%s' no se ha podido cerrar", fichero);
436: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
437: }
438: else
439: {
440: sprintf(mensaje, "[Instruccion2FicheroVentana] El fichero '%s' ha sido cerrado con éxito", fichero);
441: Notificar(mensaje, NO_ERROR, ECO_NO);
442: }
443: }
444: else
445: {
446: sprintf(mensaje, "[Instruccion2FicheroVentana] El fichero '%s' no se ha podido abrir", fichero);
447: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
448: }
449: }
450:
451:
452: /* escribo las matrices de la ventana en el fichero correspondiente */
453:
454: void Matrices2FicheroVentana()
455: {
456: FILE *handle;
457: char fichero[MAX_LINE];
458: char mensaje[MAX_LINE];
459: int i, j, dim;
460:
461: dim = configuracion.ventana;
462:
463: /* construyo el nombre a partir del número de ventana */
464:
465: sprintf(fichero, "%lu.xls", ventana);
466:
467: /* esto no es ANSI
468: _ltoa(ventana, fichero, 10);
469: strcat(fichero, ".xls"); */
470:
471: /* abro el fichero */
472: if((handle = fopen(fichero, "a")) != NULL)
473: {
474: sprintf(mensaje, "[Matrices2FicheroVentana] El fichero '%s' se ha abierto con éxito", fichero);
475: Notificar(mensaje, NO_ERROR, ECO_NO);
476:
477: /* escribo las matrices y los parámetros que de ellas se derivan */
478:
479: fprintf(handle, "\n\nMATRICES\n");
480:
481: /* FILA 1: etiquetas */
482: if(matriz.Ddatoexp != NULL) {fprintf(handle, "Ddatoexp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
483: if(matriz.Ddir_exp != NULL) {fprintf(handle, "Ddir_exp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
484: if(matriz.Dpilaexp != NULL) {fprintf(handle, "Dpilaexp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
485: if(matriz.Destadoexp != NULL) {fprintf(handle, "Destadoexp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
486: fprintf(handle, "\n");
487:
488: /* matrices */
489: for(i=0; i<dim; i++)
490: {
491: if(matriz.Ddatoexp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Ddatoexp[i][j]); fprintf(handle, "\t\t");
492: if(matriz.Ddir_exp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Ddir_exp[i][j]); fprintf(handle, "\t\t");
493: if(matriz.Dpilaexp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Dpilaexp[i][j]); fprintf(handle, "\t\t");
494: if(matriz.Destadoexp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Destadoexp[i][j]); fprintf(handle, "\n");
495: }
496:
497: /* parámetros calculados */
498: /* ¡OJO!: los separadores del sistema en EXCEL son los del castellano */
499: /* la función 'fprintf' usa los del inglés (',' para miles y '.' para decimales) */
500: /* lo mejor es anular en Opciones de EXCEL los separadores del sistema */
501: /* y cambiarlos a los del idioma inglés antes de abrir mis ficheros */
502: /* pasos de computación */
503: if(configuracion.pasoscomputacion == SI)
504: {
505: if(matriz.Ddatoexp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Ddatoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
506: if(matriz.Ddir_exp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Ddir_exp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
507: if(matriz.Dpilaexp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Dpilaexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
508: if(matriz.Destadoexp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Destadoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
509: fprintf(handle, "\n");
510: }
511: /* grado de paralelismo */
512: if(configuracion.gradoparalelismo == SI)
513: {
514: if(matriz.Ddatoexp != NULL) {fprintf(handle, "grado\t%.3f", grado->Ddatoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
515: if(matriz.Ddir_exp != NULL) {fprintf(handle, "grado\t%.3f", grado->Ddir_exp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
516: if(matriz.Dpilaexp != NULL) {fprintf(handle, "grado\t%.3f", grado->Dpilaexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
517: if(matriz.Destadoexp != NULL) {fprintf(handle, "grado\t%.3f", grado->Destadoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
518: fprintf(handle, "\n");
519: }
520: /* acoplamiento */
521: if(configuracion.acoplamiento == SI)
522: {
523: if(matriz.Ddatoexp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Ddatoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
524: if(matriz.Ddir_exp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Ddir_exp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
525: if(matriz.Dpilaexp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Dpilaexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
526: if(matriz.Destadoexp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Destadoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
527: fprintf(handle, "\n");
528: }
529: fprintf(handle, "\n\n");
530:
531:
532: /* FILA 2: etiquetas */
533: if(matriz.Ddatoimp != NULL) {fprintf(handle, "Ddatoimp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
534: if(matriz.Ddir_imp != NULL) {fprintf(handle, "Ddir_imp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
535: if(matriz.Dpilaimp != NULL) {fprintf(handle, "Dpilaimp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
536: if(matriz.Destadoimp != NULL) {fprintf(handle, "Destadoimp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
537: fprintf(handle, "\n");
538:
539: /* matrices */
540: for(i=0; i<dim; i++)
541: {
542: if(matriz.Ddatoimp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Ddatoimp[i][j]); fprintf(handle, "\t\t");
543: if(matriz.Ddir_imp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Ddir_imp[i][j]); fprintf(handle, "\t\t");
544: if(matriz.Dpilaimp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Dpilaimp[i][j]); fprintf(handle, "\t\t");
545: if(matriz.Destadoimp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Destadoimp[i][j]); fprintf(handle, "\n");
546: }
547:
548: /* parámetros calculados */
549: /* pasos de computación */
550: if(configuracion.pasoscomputacion == SI)
551: {
552: if(matriz.Ddatoimp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Ddatoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
553: if(matriz.Ddir_imp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Ddir_imp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
554: if(matriz.Dpilaimp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Dpilaimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
555: if(matriz.Destadoimp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Destadoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
556: fprintf(handle, "\n");
557: }
558: /* grado de paralelismo */
559: if(configuracion.gradoparalelismo == SI)
560: {
561: if(matriz.Ddatoimp != NULL) {fprintf(handle, "grado\t%.3f", grado->Ddatoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
562: if(matriz.Ddir_imp != NULL) {fprintf(handle, "grado\t%.3f", grado->Ddir_imp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
563: if(matriz.Dpilaimp != NULL) {fprintf(handle, "grado\t%.3f", grado->Dpilaimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
564: if(matriz.Destadoimp != NULL) {fprintf(handle, "grado\t%.3f", grado->Destadoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
565: fprintf(handle, "\n");
566: }
567: /* acoplamiento */
568: if(configuracion.acoplamiento == SI)
569: {
570: if(matriz.Ddatoimp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Ddatoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
571: if(matriz.Ddir_imp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Ddir_imp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
572: if(matriz.Dpilaimp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Dpilaimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
573: if(matriz.Destadoimp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Destadoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
574: fprintf(handle, "\n");
575: }
576: fprintf(handle, "\n\n");
577:
578:
579: /* FILA 3: etiquetas */
580: if(matriz.ADdatoexp != NULL) {fprintf(handle, "ADdatoexp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
581: if(matriz.ADdir_exp != NULL) {fprintf(handle, "ADdir_exp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
582: if(matriz.ADpilaexp != NULL) {fprintf(handle, "ADpilaexp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
583: if(matriz.ADestadoexp != NULL) {fprintf(handle, "ADestadoexp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
584: fprintf(handle, "\n");
585:
586: /* matrices */
587: for(i=0; i<dim; i++)
588: {
589: if(matriz.ADdatoexp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.ADdatoexp[i][j]); fprintf(handle, "\t\t");
590: if(matriz.ADdir_exp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.ADdir_exp[i][j]); fprintf(handle, "\t\t");
591: if(matriz.ADpilaexp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.ADpilaexp[i][j]); fprintf(handle, "\t\t");
592: if(matriz.ADestadoexp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.ADestadoexp[i][j]); fprintf(handle, "\n");
593: }
594:
595: /* parámetros calculados */
596: /* pasos de computación */
597: if(configuracion.pasoscomputacion == SI)
598: {
599: if(matriz.ADdatoexp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->ADdatoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
600: if(matriz.ADdir_exp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->ADdir_exp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
601: if(matriz.ADpilaexp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->ADpilaexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
602: if(matriz.ADestadoexp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->ADestadoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
603: fprintf(handle, "\n");
604: }
605: /* grado de paralelismo */
606: if(configuracion.gradoparalelismo == SI)
607: {
608: if(matriz.ADdatoexp != NULL) {fprintf(handle, "grado\t%.3f", grado->ADdatoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
609: if(matriz.ADdir_exp != NULL) {fprintf(handle, "grado\t%.3f", grado->ADdir_exp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
610: if(matriz.ADpilaexp != NULL) {fprintf(handle, "grado\t%.3f", grado->ADpilaexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
611: if(matriz.ADestadoexp != NULL) {fprintf(handle, "grado\t%.3f", grado->ADestadoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
612: fprintf(handle, "\n");
613: }
614: /* acoplamiento */
615: if(configuracion.acoplamiento == SI)
616: {
617: if(matriz.ADdatoexp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->ADdatoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
618: if(matriz.ADdir_exp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->ADdir_exp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
619: if(matriz.ADpilaexp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->ADpilaexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
620: if(matriz.ADestadoexp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->ADestadoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
621: fprintf(handle, "\n");
622: }
623: fprintf(handle, "\n\n");
624:
625:
626: /* FILA 4: etiquetas */
627: if(matriz.ADdatoimp != NULL) {fprintf(handle, "ADdatoimp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
628: if(matriz.ADdir_imp != NULL) {fprintf(handle, "ADdir_imp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
629: if(matriz.ADpilaimp != NULL) {fprintf(handle, "ADpilaimp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
630: if(matriz.ADestadoimp != NULL) {fprintf(handle, "ADestadoimp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
631: fprintf(handle, "\n");
632:
633: /* matrices */
634: for(i=0; i<dim; i++)
635: {
636: if(matriz.ADdatoimp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.ADdatoimp[i][j]); fprintf(handle, "\t\t");
637: if(matriz.ADdir_imp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.ADdir_imp[i][j]); fprintf(handle, "\t\t");
638: if(matriz.ADpilaimp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.ADpilaimp[i][j]); fprintf(handle, "\t\t");
639: if(matriz.ADestadoimp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.ADestadoimp[i][j]); fprintf(handle, "\n");
640: }
641:
642: /* parámetros calculados */
643: /* pasos de computación */
644: if(configuracion.pasoscomputacion == SI)
645: {
646: if(matriz.ADdatoimp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->ADdatoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
647: if(matriz.ADdir_imp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->ADdir_imp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
648: if(matriz.ADpilaimp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->ADpilaimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
649: if(matriz.ADestadoimp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->ADestadoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
650: fprintf(handle, "\n");
651: }
652: /* grado de paralelismo */
653: if(configuracion.gradoparalelismo == SI)
654: {
655: if(matriz.ADdatoimp != NULL) {fprintf(handle, "grado\t%.3f", grado->ADdatoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
656: if(matriz.ADdir_imp != NULL) {fprintf(handle, "grado\t%.3f", grado->ADdir_imp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
657: if(matriz.ADpilaimp != NULL) {fprintf(handle, "grado\t%.3f", grado->ADpilaimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
658: if(matriz.ADestadoimp != NULL) {fprintf(handle, "grado\t%.3f", grado->ADestadoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
659: fprintf(handle, "\n");
660: }
661: /* acoplamiento */
662: if(configuracion.acoplamiento == SI)
663: {
664: if(matriz.ADdatoimp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->ADdatoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
665: if(matriz.ADdir_imp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->ADdir_imp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
666: if(matriz.ADpilaimp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->ADpilaimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
667: if(matriz.ADestadoimp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->ADestadoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
668: fprintf(handle, "\n");
669: }
670: fprintf(handle, "\n\n");
671:
672:
673: /* FILA 5: etiquetas */
674: if(matriz.Sdatoexp != NULL) {fprintf(handle, "Sdatoexp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
675: if(matriz.Sdir_exp != NULL) {fprintf(handle, "Sdir_exp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
676: if(matriz.Spilaexp != NULL) {fprintf(handle, "Spilaexp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
677: if(matriz.Sestadoexp != NULL) {fprintf(handle, "Sestadoexp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
678: fprintf(handle, "\n");
679:
680: /* matrices */
681: for(i=0; i<dim; i++)
682: {
683: if(matriz.Sdatoexp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Sdatoexp[i][j]); fprintf(handle, "\t\t");
684: if(matriz.Sdir_exp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Sdir_exp[i][j]); fprintf(handle, "\t\t");
685: if(matriz.Spilaexp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Spilaexp[i][j]); fprintf(handle, "\t\t");
686: if(matriz.Sestadoexp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Sestadoexp[i][j]); fprintf(handle, "\n");
687: }
688:
689: /* parámetros calculados */
690: /* pasos de computación */
691: if(configuracion.pasoscomputacion == SI)
692: {
693: if(matriz.Sdatoexp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Sdatoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
694: if(matriz.Sdir_exp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Sdir_exp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
695: if(matriz.Spilaexp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Spilaexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
696: if(matriz.Sestadoexp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Sestadoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
697: fprintf(handle, "\n");
698: }
699: /* grado de paralelismo */
700: if(configuracion.gradoparalelismo == SI)
701: {
702: if(matriz.Sdatoexp != NULL) {fprintf(handle, "grado\t%.3f", grado->Sdatoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
703: if(matriz.Sdir_exp != NULL) {fprintf(handle, "grado\t%.3f", grado->Sdir_exp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
704: if(matriz.Spilaexp != NULL) {fprintf(handle, "grado\t%.3f", grado->Spilaexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
705: if(matriz.Sestadoexp != NULL) {fprintf(handle, "grado\t%.3f", grado->Sestadoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
706: fprintf(handle, "\n");
707: }
708: /* acoplamiento */
709: if(configuracion.acoplamiento == SI)
710: {
711: if(matriz.Sdatoexp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Sdatoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
712: if(matriz.Sdir_exp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Sdir_exp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
713: if(matriz.Spilaexp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Spilaexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
714: if(matriz.Sestadoexp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Sestadoexp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
715: fprintf(handle, "\n");
716: }
717: fprintf(handle, "\n\n");
718:
719:
720: /* FILA 6: etiquetas */
721: if(matriz.Sdatoimp != NULL) {fprintf(handle, "Sdatoimp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
722: if(matriz.Sdir_imp != NULL) {fprintf(handle, "Sdir_imp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
723: if(matriz.Spilaimp != NULL) {fprintf(handle, "Spilaimp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
724: if(matriz.Sestadoimp != NULL) {fprintf(handle, "Sestadoimp"); for(i=0; i<dim+2; i++) fprintf(handle, "\t");}
725: fprintf(handle, "\n");
726:
727: /* matrices */
728: for(i=0; i<dim; i++)
729: {
730: if(matriz.Sdatoimp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Sdatoimp[i][j]); fprintf(handle, "\t\t");
731: if(matriz.Sdir_imp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Sdir_imp[i][j]); fprintf(handle, "\t\t");
732: if(matriz.Spilaimp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Spilaimp[i][j]); fprintf(handle, "\t\t");
733: if(matriz.Sestadoimp != NULL) for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.Sestadoimp[i][j]); fprintf(handle, "\n");
734: }
735:
736: /* parámetros calculados */
737: /* pasos de computación */
738: if(configuracion.pasoscomputacion == SI)
739: {
740: if(matriz.Sdatoimp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Sdatoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
741: if(matriz.Sdir_imp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Sdir_imp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
742: if(matriz.Spilaimp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Spilaimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
743: if(matriz.Sestadoimp != NULL) {fprintf(handle, "pasos\t%.3f", pasos->Sestadoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
744: fprintf(handle, "\n");
745: }
746: /* grado de paralelismo */
747: if(configuracion.gradoparalelismo == SI)
748: {
749: if(matriz.Sdatoimp != NULL) {fprintf(handle, "grado\t%.3f", grado->Sdatoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
750: if(matriz.Sdir_imp != NULL) {fprintf(handle, "grado\t%.3f", grado->Sdir_imp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
751: if(matriz.Spilaimp != NULL) {fprintf(handle, "grado\t%.3f", grado->Spilaimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
752: if(matriz.Sestadoimp != NULL) {fprintf(handle, "grado\t%.3f", grado->Sestadoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
753: fprintf(handle, "\n");
754: }
755: /* acoplamiento */
756: if(configuracion.acoplamiento == SI)
757: {
758: if(matriz.Sdatoimp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Sdatoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
759: if(matriz.Sdir_imp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Sdir_imp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
760: if(matriz.Spilaimp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Spilaimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
761: if(matriz.Sestadoimp != NULL) {fprintf(handle, "acoplo\t%.3f", acoplo->Sestadoimp); for(i=0; i<dim+1; i++) fprintf(handle, "\t");}
762: fprintf(handle, "\n");
763: }
764: fprintf(handle, "\n\n");
765:
766:
767: /* matriz D */
768: /* etiqueta */
769: fprintf(handle, "D\n");
770: /* matriz */
771: for(i=0; i<dim; i++) {for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matriz.D[i][j]); fprintf(handle, "\n");}
772: /* parámetros calculados */
773: /* pasos de computación */
774: if(configuracion.pasoscomputacion == SI) fprintf(handle, "pasos\t%.3f\n", pasos->D);
775: /* grado de paralelismo */
776: if(configuracion.gradoparalelismo == SI) fprintf(handle, "grado\t%.3f\n", grado->D);
777: /* acoplamiento */
778: if(configuracion.acoplamiento == SI) fprintf(handle, "acoplo\t%.3f\n", acoplo->D);
779: fprintf(handle, "\n\n");
780:
781: /* orden parcial asociado a la matriz D */
782: if(configuracion.ordenparcial == SI)
783: {
784: fprintf(handle, "orden parcial asociado a la matriz D\n");
785: /* coloco el caracter "'" delante del listado del OrdenParcial */
786: /* para que EXCEL lo tome como cadena y no como fecha */
787: for(i=0; i<dim; i++) fprintf(handle, "paso\t%3d\t'%s\n", i+1, OrdenParcial[i]);
788: fprintf(handle, "\n\n");
789: }
790:
791: /* matriz C */
792: if(configuracion.matrizcaminos == SI)
793: {
794: fprintf(handle, "C\n");
795: for(i=0; i<dim; i++) {for(j=0; j<dim; j++) fprintf(handle, "%3d\t", matrizC[i][j]); fprintf(handle, "\n");}
796: fprintf(handle, "\n\n");
797: }
798:
799:
800:
801: /* cierro el fichero */
802: if(fclose(handle))
803: {
804: sprintf(mensaje, "[Matrices2FicheroVentana] El fichero '%s' no se ha podido cerrar", fichero);
805: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
806: }
807: else
808: {
809: sprintf(mensaje, "[Matrices2FicheroVentana] El fichero '%s' ha sido cerrado con éxito", fichero);
810: Notificar(mensaje, NO_ERROR, ECO_NO);
811: }
812: }
813: else
814: {
815: sprintf(mensaje, "[Matrices2FicheroVentana] El fichero '%s' no se ha podido abrir", fichero);
816: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
817: }
818: }
819:
820:
821: /* función que salva la configuración en un fichero previamente abierto */
822: /* OJO -> faltan parámetros */
823: /* ¿usar tantas cadenas constantes puede consumir memoria de una manera relevante?*/
824: #if 0
825: void SalvarConfiguracion(FILE *handle)
826: {
827: /* escribo la configuración */
828: fprintf(handle, "CAPTURA DE CONFIGURACIÓN =\t%s\n", configuracion.captura);
829: /* FICHERO DE CONFIGURACIÓN POR DEFECTO */
830: fprintf(handle, "FICHERO DE CONFIGURACIÓN =\t%s\n", configuracion.ficheroconfig);
831: /* FICHEROS DE BASE DE DATOS */
832: fprintf(handle, "FICHERO DE OPERACIONES =\t%s\n", configuracion.ficheronemos);
833: fprintf(handle, "FICHERO DE SÍMBOLOS =\t%s\n", configuracion.ficheroubis);
834: if(configuracion.cpi == SI)
835: fprintf(handle, "FICHERO DE CICLOS =\t%s\n", configuracion.ficherociclos);
836:
837: /* ORIGEN DE DATOS */
838: switch(configuracion.origen)
839: {
840: case TRAZA:
841: fprintf(handle, "ORIGEN DE DATOS =\t%s\n", "TRAZA");
842: break;
843:
844: case SECUENCIA:
845: fprintf(handle, "ORIGEN DE DATOS =\t%s\n", "SECUENCIA");
846: break;
847:
848: case CADENAHEX:
849: fprintf(handle, "ORIGEN DE DATOS =\t%s\n", "CADENAHEX");
850: break;
851: }
852:
853: if(configuracion.origen != CADENAHEX)
854: fprintf(handle, "FICHERO DE DATOS =\t%s\n", configuracion.ficherodatos);
855: else
856: fprintf(handle, "SECUENCIA DE INSTRUCCIÓN =\t%s\n", configuracion.cadenahex);
857:
858: if(configuracion.origen == TRAZA)
859: {
860: fprintf(handle, "RANGO =\t%.2f%%\n", configuracion.rango);
861: fprintf(handle, "COMIENZO =\t%.2f%%\n", configuracion.comienzo);
862: fprintf(handle, "INSTRUCCIÓN DE COMIENZO =\t%lu\n", configuracion.primera);
863: fprintf(handle, "INSTRUCCIÓN FINAL =\t%lu\n", configuracion.ultima);
864: }
865:
866: /* EVALUAR */
867: fprintf(handle, "RECUENTOS =\t%s\n", configuracion.recuentos==SI ? "SI":"NO");
868: fprintf(handle, "ASIGNAR CPI =\t%s\n", configuracion.cpi==SI ? "SI":"NO");
869:
870: /* PARÁMETROS DE ANÁLISIS DE DEPENDENCIAS DE DATOS */
871: fprintf(handle, "TAMAÑO VENTANA INSTRUCCIONES =\t%u\n", configuracion.ventana);
872: fprintf(handle, "LISTADO DE UBICACIONES =\t%s\n", configuracion.listaubis);
873: fprintf(handle, "DESACOPLAR TIPOS DE DEPENDENCIAS =\t%s\n", configuracion.desacoplartipos==SI ? "SI":"NO");
874: fprintf(handle, "DEPENDENCIAS VERDADERAS =\t%s\n", configuracion.verdaderas==SI ? "SI":"NO");
875: fprintf(handle, "ANTIDEPENDENCIAS =\t%s\n", configuracion.antidependencias==SI ? "SI":"NO");
876: fprintf(handle, "DEPENDENCIAS DE SALIDA =\t%s\n", configuracion.salida==SI ? "SI":"NO");
877: fprintf(handle, "DESACOPLAR ORIGEN DE OPERANDOS =\t%s\n", configuracion.desacoplarorigen==SI ? "SI":"NO");
878: fprintf(handle, "OPERANDOS EXPLÍCITOS =\t%s\n", configuracion.explicitos==SI ? "SI":"NO");
879: fprintf(handle, "OPERANDOS IMPLÍCITOS =\t%s\n", configuracion.implicitos==SI ? "SI":"NO");
880: fprintf(handle, "DESACOPLAR FUENTES DE DEPENDENCIAS =\t%s\n", configuracion.desacoplarfuentes==SI ? "SI":"NO");
881: fprintf(handle, "DEPENDENCIAS DE DATOS =\t%s\n", configuracion.datos==SI ? "SI":"NO");
882: fprintf(handle, "DEPENDENCIAS DE DIRECCIONES =\t%s\n", configuracion.direcciones==SI ? "SI":"NO");
883: fprintf(handle, "DEPENDENCIAS DE PILA =\t%s\n", configuracion.pila==SI ? "SI":"NO");
884: fprintf(handle, "DEPENDENCIAS DE CÓDIGOS DE CONDICIÓN =\t%s\n", configuracion.cc==SI ? "SI":"NO");
885:
886: /* CALCULAR */
887: fprintf(handle, "CALCULAR GRADO DE PARALELISMO =\t%s\n", configuracion.gradoparalelismo==SI ? "SI":"NO");
888: fprintf(handle, "CALCULAR TIEMPO DE EJECUCIÓN =\t%s\n", configuracion.tiempo==SI ? "SI":"NO");
889:
890: /* CONFIGURACIÓN DEL INFORME */
891: fprintf(handle, "FICHERO DE RESULTADOS =\t%s.xls\n", configuracion.ficheroresultados);
892: fprintf(handle, "VOLCAR BD EN FICHEROS =\t%s\n\n", configuracion.volcarBD==SI ? "SI":"NO");
893: }
894: #endif
895:
896: /* función SOFISTICADA que salva la configuración en un fichero previamente abierto */
897:
898: /* cabecera -> cadena con un texto explicativo */
899: /* fecha -> SI / NO incluir fecha */
900: /* completo -> SI;CFG incluir todos los parámetros; excluir los de captura de cfg */
901: /* comentarios -> SI / NO incluir comentarios de clases de parámetros */
902: /* separador de campos de datos (' ', '\t') */
903:
904: /* cualquier información que no sea campo de datos se comenta con '[ ]' */
905: /* el fichero de configuración admite líneas en blanco */
906: /* la función 'completo' no está implementada */
907:
908: void SalvarConfiguracionFichero(FILE *handle, char *cabecera, char fecha, char completo, char comentarios, char separador)
909: {
910: time_t tiempo;
911: struct tm *ptr_tm;
912: char cadena[MAX_LINE];
913:
914: /* si hay cabecera la vuelco en el fichero */
915: if(strcmp(cabecera, "") != 0)
916: {
917: fprintf(handle, "[ADD v5.1 --Analizador de Dependencias de Datos--]\n\n");
918: fprintf(handle, "[%s]\n\n", cabecera);
919: }
920:
921: /* si hay que volcar la fecha la capturo y la vuelco */
922: if(fecha == SI)
923: {
924: /* fecha y hora */
925: tiempo = time(NULL);
926: ptr_tm = localtime(&tiempo);
927: strftime(cadena, MAX_LINE, "%d/%m/%y - %H:%M:%S", ptr_tm);
928:
929: fprintf(handle, "[Fecha de creación del fichero:\t%s]\n\n", cadena);
930: }
931:
932: /* PARÁMETROS DE CONFIGURACIÓN */
933: if(comentarios == SI) fprintf(handle, "\n[%s]\n", etiquetas[0]);
934:
935: if(completo != CFG)
936: {
937: /* OBSERVACIONES */
938: if(comentarios == SI) fprintf(handle, "\n[%s]\n", etiquetas[1]);
939: /* captura de configuración */
940: fprintf(handle, "%s =%c%s\n", claves[0], separador, configuracion.captura);
941:
942: /* FICHERO DE CONFIGURACIÓN POR DEFECTO */
943: if(comentarios == SI) fprintf(handle, "\n[%s]\n", etiquetas[2]);
944: fprintf(handle, "%s =%c'%s'\n", claves[1], separador, configuracion.ficheroconfig);
945: }
946:
947: /* FICHEROS DE BASE DE DATOS */
948: if(comentarios == SI) fprintf(handle, "\n[%s]\n", etiquetas[3]);
949: /* fichero de operaciones */
950: fprintf(handle, "%s =%c'%s'\n", claves[2], separador, configuracion.ficheronemos);
951: /* fichero de símbolos */
952: fprintf(handle, "%s =%c'%s'\n", claves[3], separador, configuracion.ficheroubis);
953: /* fichero de ciclos */
954: fprintf(handle, "%s =%c'%s'\n", claves[4], separador, configuracion.ficherociclos);
955:
956: /* ORIGEN DE DATOS */
957: if(comentarios == SI) fprintf(handle, "\n[%s]\n", etiquetas[4]);
958: /* origen de datos */
959: fprintf(handle, "%s =%c", claves[5], separador);
960: switch(configuracion.origen)
961: {
962: case TRAZA:
963: fprintf(handle, "TRAZA\n");
964: break;
965:
966: case SECUENCIA:
967: fprintf(handle, "SECUENCIA\n");
968: break;
969:
970: case CADENAHEX:
971: fprintf(handle, "CADENAHEX\n");
972: break;
973: }
974: /* fichero de datos */
975: fprintf(handle, "%s =%c'%s'\n", claves[6], separador, configuracion.ficherodatos);
976: /* secuencia hexadecimal de una instrucción */
977: fprintf(handle, "%s =%c%s\n", claves[7], separador, configuracion.cadenahex);
978: /* rango de análisis en porcentaje (sólo trazas) */
979: fprintf(handle, "%s =%c%2.2f%%\n", claves[8], separador, configuracion.rango);
980: /* instrucción de comienzo en porcentaje */
981: fprintf(handle, "%s =%c%2.2f%%\n", claves[9], separador, configuracion.comienzo);
982: /* primera instrucción */
983: fprintf(handle, "%s =%c%lu\n", claves[10], separador, configuracion.primera);
984: /* última instrucción */
985: fprintf(handle, "%s =%c%lu\n", claves[11], separador, configuracion.ultima);
986:
987: /* EVALUAR */
988: if(comentarios == SI) fprintf(handle, "\n[%s]\n", etiquetas[5]);
989: /* ¿hacer recuentos? */
990: fprintf(handle, "%s =%c%s\n", claves[12], separador, configuracion.recuentos==SI ? "SI":"NO");
991: /* ¿asignar ciclos a cada instrucción? */
992: fprintf(handle, "%s =%c%s\n", claves[13], separador, configuracion.cpi==SI ? "SI":"NO");
993: /* ¿hacer análisis de dependencias? */
994: fprintf(handle, "%s =%c%s\n", claves[14], separador, configuracion.dependencias==SI ? "SI":"NO");
995:
996: /* PARÁMETROS DE ANÁLISIS DE DEPENDENCIAS */
997: if(comentarios == SI) fprintf(handle, "\n[%s]\n", etiquetas[6]);
998: /* tamaño de la ventana de instrucciones */
999: fprintf(handle, "%s =%c%d\n", claves[15], separador, configuracion.ventana);
1000: /* listado de ubicaciones que van a la pizarra de dependencias */
1001: fprintf(handle, "%s =%c'%s'\n", claves[16], separador, configuracion.listaubis);
1002: /* ¿desacoplar tipos de dependencias? */
1003: fprintf(handle, "%s =%c%s\n", claves[17], separador, configuracion.desacoplartipos==SI ? "SI":"NO");
1004: /* ¿considerar dependencias verdaderas? */
1005: fprintf(handle, "%s =%c%s\n", claves[18], separador, configuracion.verdaderas==SI ? "SI":"NO");
1006: /* ¿considerar antidependencias? */
1007: fprintf(handle, "%s =%c%s\n", claves[19], separador, configuracion.antidependencias==SI ? "SI":"NO");
1008: /* ¿considerar dependencias de salida? */
1009: fprintf(handle, "%s =%c%s\n", claves[20], separador, configuracion.salida==SI ? "SI":"NO");
1010: /* ¿desacoplar origen de dependencias? */
1011: fprintf(handle, "%s =%c%s\n", claves[21], separador, configuracion.desacoplarorigen==SI ? "SI":"NO");
1012: /* ¿considerar explícitas? */
1013: fprintf(handle, "%s =%c%s\n", claves[22], separador, configuracion.explicitos==SI ? "SI":"NO");
1014: /* ¿considerar implícitas? */
1015: fprintf(handle, "%s =%c%s\n", claves[23], separador, configuracion.implicitos==SI ? "SI":"NO");
1016: /* ¿desacoplar fuentes de dependencias? */
1017: fprintf(handle, "%s =%c%s\n", claves[24], separador, configuracion.desacoplarfuentes==SI ? "SI":"NO");
1018: /* ¿procesamiento de datos? */
1019: fprintf(handle, "%s =%c%s\n", claves[25], separador, configuracion.datos==SI ? "SI":"NO");
1020: /* ¿cómputo de direcciones? */
1021: fprintf(handle, "%s =%c%s\n", claves[26], separador, configuracion.direcciones==SI ? "SI":"NO");
1022: /* ¿tráfico con la pila? */
1023: fprintf(handle, "%s =%c%s\n", claves[27], separador, configuracion.pila==SI ? "SI":"NO");
1024: /* ¿códigos de condición? */
1025: fprintf(handle, "%s =%c%s\n", claves[28], separador, configuracion.cc==SI ? "SI":"NO");
1026:
1027: /* CALCULAR */
1028: if(comentarios == SI) fprintf(handle, "\n[%s]\n", etiquetas[7]);
1029: /* ¿calcular CPI promedio? */
1030: fprintf(handle, "%s =%c%s\n", claves[29], separador, configuracion.CPImedio==SI ? "SI":"NO");
1031: /* ¿calcular tiempo de ejecución? */
1032: fprintf(handle, "%s =%c%s\n", claves[30], separador, configuracion.tiempo==SI ? "SI":"NO");
1033: /* ¿obtener la lista de orden parcial? */
1034: fprintf(handle, "%s =%c%s\n", claves[31], separador, configuracion.ordenparcial==SI ? "SI":"NO");
1035: /* ¿calcular la matriz de caminos? */
1036: fprintf(handle, "%s =%c%s\n", claves[32], separador, configuracion.matrizcaminos==SI ? "SI":"NO");
1037: /* ¿calcular pasos de computación para cada ventana? */
1038: fprintf(handle, "%s =%c%s\n", claves[33], separador, configuracion.pasoscomputacion==SI ? "SI":"NO");
1039: /* ¿determinar grado de paralelismo? */
1040: fprintf(handle, "%s =%c%s\n", claves[34], separador, configuracion.gradoparalelismo==SI ? "SI":"NO");
1041: /* ¿calcular acoplamiento? */
1042: fprintf(handle, "%s =%c%s\n", claves[35], separador, configuracion.acoplamiento==SI ? "SI":"NO");
1043: /* ¿generar histograma de pasos de computación? */
1044: fprintf(handle, "%s =%c%s\n", claves[36], separador, configuracion.distribucionpasos==SI ? "SI":"NO");
1045:
1046: /* CONFIGURACIÓN DEL INFORME */
1047: if(comentarios == SI) fprintf(handle, "\n[%s]\n", etiquetas[8]);
1048: /* volcar bases de datos en ficheros */
1049: fprintf(handle, "%s =%c%s\n", claves[37], separador, configuracion.volcarBD==SI ? "SI":"NO");
1050: /* volcar la configuración en curso en un fichero nuevo */
1051: fprintf(handle, "%s =%c%s\n", claves[38], separador, configuracion.crearficheroconfig==SI ? "SI":"NO");
1052: /* nombre del nuevo fichero de configuración */
1053: fprintf(handle, "%s =%c'%s'\n", claves[39], separador, configuracion.nuevoficheroconfig);
1054: /* lista de ventanas a volcar en ficheros EXCEL */
1055: fprintf(handle, "%s =%c'%s'\n", claves[40], separador, configuracion.volcarventana);
1056: /* nombre del fichero de resultados */
1057: fprintf(handle, "%s =%c'%s'\n", claves[41], separador, configuracion.ficheroresultados);
1058: /* nivel de notificación en el fichero de log */
1059: fprintf(handle, "%s =%c", claves[42], separador);
1060: switch(configuracion.nivelnotificaciones)
1061: {
1062: case ALL:
1063: fprintf(handle, "ALL\n");
1064: break;
1065:
1066: case EX_CFG:
1067: fprintf(handle, "EX_CFG\n");
1068: break;
1069:
1070: case ERRORS:
1071: fprintf(handle, "ERRORS\n");
1072: break;
1073: }
1074:
1075: /* INTERFASE GRÁFICA */
1076: if(comentarios == SI) fprintf(handle, "\n[%s]\n", etiquetas[9]);
1077: /* mostrar información de la instrucción en curso */
1078: fprintf(handle, "%s =%c%s\n", claves[43], separador, configuracion.verinstruccion==SI ? "SI":"NO");
1079: /* mostrar información de la ventna en curso */
1080: fprintf(handle, "%s =%c%s\n", claves[44], separador, configuracion.verventana==SI ? "SI":"NO");
1081:
1082: fprintf(handle, "\n\n");
1083: }
1084:
1085:
1086: /* función que crea un fichero de configuración con los parámetros de configuración en curso */
1087:
1088: void CrearFicheroConfiguracion()
1089: {
1090: FILE *handle;
1091: char nombrefichero[MAX_LINE];
1092: char mensaje[MAX_LINE];
1093:
1094: sprintf(nombrefichero, "%s.cfg", configuracion.nuevoficheroconfig);
1095:
1096: /* abro el fichero */
1097: if((handle = fopen(nombrefichero, "w")) != NULL)
1098: {
1099: sprintf(mensaje, "[CrearFicheroConfiguracion] El fichero '%s' se ha abierto con éxito", nombrefichero);
1100: Notificar(mensaje, NO_ERROR, ECO_NO);
1101:
1102: /* vuelco la configuración */
1103: strcpy(mensaje, "Nuevo fichero de configuración");
1104: /* fecha SI, completo CFG, comentarios SI, separador " "); */
1105: SalvarConfiguracionFichero(handle, mensaje, SI, CFG, SI, ' ');
1106:
1107: /* SalvarConfiguracion(handle); */
1108:
1109: /* cierro el fichero */
1110: if(fclose(handle))
1111: {
1112: sprintf(mensaje, "[CrearFicheroConfiguracion] El fichero '%s' no se ha podido cerrar", nombrefichero);
1113: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
1114: }
1115: else
1116: {
1117: sprintf(mensaje, "[CrearFicheroConfiguracion] El fichero '%s' ha sido cerrado con éxito", nombrefichero);
1118: Notificar(mensaje, NO_ERROR, ECO_NO);
1119: }
1120: }
1121: else
1122: {
1123: sprintf(mensaje, "[CrearFicheroConfiguracion] El fichero '%s' no se ha podido abrir", nombrefichero);
1124: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
1125: }
1126: }
1127:
1128:
1129: /* EJEMPLO de manejo de funciones de fecha y hora */
1130: /*
1131: #include <stdio.h>
1132: #include <time.h>
1133:
1134: int main()
1135: {
1136: time_t tiempo;
1137: char cad[80];
1138: struct tm *tmPtr;
1139:
1140: tiempo = time(NULL);
1141: tmPtr = localtime(&tiempo);
1142: strftime( cad, 80, "%H:%M.%S, %A de %B de %Y", tmPtr );
1143:
1144: printf( "La hora local es: %s\n", asctime(tmPtr) );
1145: printf( "La hora y fecha locales son: %s\n", cad );
1146:
1147: return 0;
1148: }
1149: */
1150:
1151:
1152: /* esta función escribe una variable agregada en un fichero */
1153:
1154: void SalvarVariableAgregada(char *cadena, parametromatriz *variable, FILE *handle)
1155: {
1156: if(matriz.Ddatoexp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Ddatoexp", variable->Ddatoexp);
1157: if(matriz.Ddir_exp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Ddir_exp", variable->Ddir_exp);
1158: if(matriz.Dpilaexp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Dpilaexp", variable->Dpilaexp);
1159: if(matriz.Destadoexp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Destadoexp", variable->Destadoexp);
1160:
1161: if(matriz.Ddatoimp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Ddatoimp", variable->Ddatoimp);
1162: if(matriz.Ddir_imp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Ddir_imp", variable->Ddir_imp);
1163: if(matriz.Dpilaimp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Dpilaimp", variable->Dpilaimp);
1164: if(matriz.Destadoimp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Destadoimp", variable->Destadoimp);
1165:
1166: if(matriz.ADdatoexp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "ADdatoexp", variable->ADdatoexp);
1167: if(matriz.ADdir_exp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "ADdir_exp", variable->ADdir_exp);
1168: if(matriz.ADpilaexp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "ADpilaexp", variable->ADpilaexp);
1169: if(matriz.ADestadoexp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "ADestadoexp", variable->ADestadoexp);
1170:
1171: if(matriz.ADdatoimp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "ADdatoimp", variable->ADdatoimp);
1172: if(matriz.ADdir_imp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "ADdir_imp", variable->ADdir_imp);
1173: if(matriz.ADpilaimp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "ADpilaimp", variable->ADpilaimp);
1174: if(matriz.ADestadoimp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "ADestadoimp", variable->ADestadoimp);
1175:
1176: if(matriz.Sdatoexp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Sdatoexp", variable->Sdatoexp);
1177: if(matriz.Sdir_exp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Sdir_exp", variable->Sdir_exp);
1178: if(matriz.Spilaexp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Spilaexp", variable->Spilaexp);
1179: if(matriz.Sestadoexp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Sestadoexp", variable->Sestadoexp);
1180:
1181: if(matriz.Sdatoimp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Sdatoimp", variable->Sdatoimp);
1182: if(matriz.Sdir_imp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Sdir_imp", variable->Sdir_imp);
1183: if(matriz.Spilaimp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Spilaimp", variable->Spilaimp);
1184: if(matriz.Sestadoimp != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "Sestadoimp", variable->Sestadoimp);
1185:
1186: if(matriz.D != NULL) fprintf(handle, "%s %s\t%f\n", cadena, "D", variable->D);
1187:
1188: fprintf(handle, "\n");
1189: }
1190:
1191:
1192:
1193: /* RESULTADOS */
1194: /* función que crea un fichero EXCEL con los resultados */
1195:
1196: void CrearFicheroResultados (char *fichero)
1197: {
1198: time_t tiempo;
1199: struct tm *ptr_tm;
1200:
1201: FILE *handle;
1202: unsigned int i;
1203: char nombrefichero[MAX_LINE];
1204:
1205: char mensaje[MAX_LINE];
1206: char *ptr;
1207:
1208:
1209: /* el fichero de resultados va a tener el formato de texto EXCEL */
1210: /* construyo el nombre del fichero con el prefijo indicado en la */
1211: /* configuración más el nombre del fichero origen de datos sin */
1212: /* extensión más el tamaño de la ventana de instrucciones */
1213: /* al nombre del fichero le asigno la extensión .XLS */
1214:
1215: /* esto cambia la configuración ya que añade la extensión => strcat(fichero, ".xls"); */
1216: /* otro modo de hacer lo mismo => sprintf(cadena, "%s.xls", fichero); */
1217:
1218: /* construyo el nombre del fichero de resultados */
1219: /* palabra + fichero de datos + tamaño de ventana + mapa de dependencias */
1220: strcpy(mensaje, configuracion.ficherodatos);
1221: ptr = mensaje + strlen(mensaje); /* coloco un puntero al final */
1222: /* busco la última barra viajando hacia atrás hasta alcanzar el comienzo */
1223: while(*(--ptr)!='/' && *ptr!='\\' && ptr!=mensaje-1);
1224: strcpy(mensaje, ++ptr); /* actualizo la cadena */
1225: ptr = mensaje; /* coloco el puntero al principio */
1226: /* finalizo la cadena cuando encuentro la .ext */
1227: while(*(++ptr)!='.' && *ptr!='\0'); *ptr = '\0';
1228: sprintf(nombrefichero, "%s %s %u (%c%c%c)(%c%c)(%c%c%c%c).xls",
1229: fichero,
1230: mensaje,
1231: configuracion.ventana,
1232: configuracion.verdaderas==SI ? 'x':'o',
1233: configuracion.antidependencias==SI ? 'x':'o',
1234: configuracion.salida==SI ? 'x':'o',
1235: configuracion.explicitos==SI ? 'x':'o',
1236: configuracion.implicitos==SI ? 'x':'o',
1237: configuracion.datos==SI ? 'x':'o',
1238: configuracion.direcciones==SI ? 'x':'o',
1239: configuracion.pila==SI ? 'x':'o',
1240: configuracion.cc==SI ? 'x':'o');
1241:
1242:
1243: /* abro el fichero */
1244: if((handle = fopen(nombrefichero, "w")) != NULL)
1245: {
1246: sprintf(mensaje, "[CrearFicheroResultados] El fichero '%s' se ha abierto con éxito", nombrefichero);
1247: Notificar(mensaje, NO_ERROR, ECO_NO);
1248:
1249: /* escribo una pequeña cabecera */
1250: fprintf(handle, "RESULTADOS DEL ANÁLISIS\n\n");
1251: /* fecha y hora */
1252: tiempo = time(NULL);
1253: ptr_tm = localtime(&tiempo);
1254: /* la cadena devuelta tiene formato inglés => strcpy(mensaje, asctime(ptr_tm)); */
1255: strftime(mensaje, MAX_LINE, "%d/%m/%y\t%H:%M:%S", ptr_tm);
1256: /*
1257: strftime(mensaje, MAX_LINE, "%c", ptr_tm);
1258: strftime(mensaje, MAX_LINE, "%#c", ptr_tm);
1259: strftime(mensaje, MAX_LINE, "%x", ptr_tm);
1260: strftime(mensaje, MAX_LINE, "%#x", ptr_tm);
1261: */
1262:
1263: fprintf(handle, "Fecha de creación del fichero\t%s \n\n", mensaje);
1264:
1265: /* vuelco la configuración en el fichero de resultados */
1266: /* sin cabecera, fecha NO, completo SI, comentarios SI, separador "\t"); */
1267: SalvarConfiguracionFichero(handle, "", NO, SI, SI, '\t');
1268:
1269: /* SalvarConfiguracion(handle); */
1270:
1271:
1272: /* VOLUMEN DE INFORMACIÓN PROCESADA */
1273: fprintf(handle, "VOLUMEN DE INFORMACIÓN PROCESADA\n");
1274: fprintf(handle, "Instrucciones procesadas\t%lu\n", instruccion-1);
1275: fprintf(handle, "Ventanas procesadas\t%lu", ventana);
1276: fprintf(handle, "\n\n");
1277:
1278: /* INFORME DE RECUENTOS */
1279: if(configuracion.recuentos == SI)
1280: {
1281: fprintf(handle, "RECUENTOS:\n");
1282: fprintf(handle, "Nemónicos:\n");
1283: for(i=0; i<num_nemonicos; i++) /* RECUENTO DE NEMÓNICOS */
1284: {
1285: fprintf(handle, "%s\t%lu\n", nemonicos[i].nemonico, contadornemonicos[i]);
1286: }
1287:
1288: fprintf(handle, "\n");
1289: fprintf(handle, "Acceso a operandos explícitos:\n");
1290: fprintf(handle, "Símbolos\tlecturas\tescrituras\n");
1291: for(i=0; i<num_simbolos; i++) /* RECUENTO DE ACCESO A DATOS */
1292: {
1293: fprintf(handle, "%s\t%lu\t%lu\n", simbolos[i].simbolo, contadorlecturas[i], contadorescrituras[i]);
1294: }
1295: fprintf(handle, "\n\n");
1296: }
1297:
1298: /* INFORME CPI MEDIO */
1299: if(configuracion.CPImedio == SI)
1300: {
1301: fprintf(handle, "CPI medio:\t%f", cpimedio);
1302: fprintf(handle, "\n\n");
1303: }
1304:
1305: /* TIEMPO DE EJECUCIÓN */
1306: if(configuracion.tiempo == SI)
1307: {
1308: fprintf(handle, "Tiempo de ejecución:\t%f\tseg", tiempoejecucion);
1309: fprintf(handle, "\n\n");
1310: }
1311:
1312: /* RESULTADOS DEL ANÁLISIS DE DEPENDENCIAS DE DATOS */
1313: if(configuracion.dependencias == SI)
1314: {
1315: fprintf(handle, "ANÁLISIS DE DEPENDENCIAS DE DATOS:\n");
1316: if(configuracion.pasoscomputacion == SI)
1317: {
1318: fprintf(handle, "Promedio de pasos de computación\n");
1319: SalvarVariableAgregada("promedio pasos", mediapasos, handle);
1320: fprintf(handle, "\n");
1321: }
1322: if(configuracion.gradoparalelismo == SI)
1323: {
1324: fprintf(handle, "Promedio de grado de paralelismo normalizado\n");
1325: SalvarVariableAgregada("grado de paralelismo", mediagrado, handle);
1326: fprintf(handle, "\n");
1327: }
1328: if(configuracion.acoplamiento == SI)
1329: {
1330: fprintf(handle, "Promedio de acoplamiento\n");
1331: SalvarVariableAgregada("acoplamiento", mediaacoplo, handle);
1332: fprintf(handle, "\n");
1333: }
1334: if(configuracion.distribucionpasos == SI)
1335: {
1336: fprintf(handle, "Histograma de pasos de computación para la matriz D\n");
1337: fprintf(handle, "pasos\tnúmero ventanas\n");
1338: /* OJO, el histograma va de 1 al tamaño de la ventana (el 0 no sirve) */
1339: for(i=1; i<configuracion.ventana+1; i++)
1340: {
1341: fprintf(handle, "%u\t%lu\n", i, distribucionpasos[i]);
1342: }
1343: }
1344: fprintf(handle, "\n\n");
1345: }
1346:
1347:
1348:
1349: /* cierro el fichero */
1350: if(fclose(handle))
1351: {
1352: sprintf(mensaje, "[CrearFicheroResultados] El fichero '%s' no se ha podido cerrar", nombrefichero);
1353: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
1354: }
1355: else
1356: {
1357: sprintf(mensaje, "[CrearFicheroResultados] El fichero '%s' ha sido cerrado con éxito", nombrefichero);
1358: Notificar(mensaje, NO_ERROR, ECO_NO);
1359: }
1360: }
1361: else
1362: {
1363: sprintf(mensaje, "[CrearFicheroResultados] El fichero '%s' no se ha podido abrir", nombrefichero);
1364: Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
1365: }
1366: }
1367:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>