Annotation of ADD_ver_10/Source Code/Source Files/Ficheros.c, revision 1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>