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

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

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