File:  [local] / rpl / src / instructions_l3.c
Revision 1.8: download - view: text, annotated - select for diffs - revision graph
Mon May 24 10:58:33 2010 UTC (13 years, 11 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_16, rpl-4_0_15, HEAD
En route pour la 4.0.16 !

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.16
    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl.conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'legv'
   29: ================================================================================
   30:   Entrées : pointeur sur une structure struct_processus
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_legv(struct_processus *s_etat_processus)
   40: {
   41:     struct_objet                *s_objet_argument;
   42:     struct_objet                *s_objet_resultat_1;
   43:     struct_objet                *s_objet_resultat_2;
   44: 
   45:     (*s_etat_processus).erreur_execution = d_ex;
   46: 
   47:     if ((*s_etat_processus).affichage_arguments == 'Y')
   48:     {
   49:         printf("\n  LEGV ");
   50:         
   51:         if ((*s_etat_processus).langue == 'F')
   52:         {
   53:             printf("(valeurs et vecteurs propres gauches)\n\n");
   54:         }
   55:         else
   56:         {
   57:             printf("(eigenvalues and left eigenvectors)\n\n");
   58:         }
   59: 
   60:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
   61:         printf("->  2: %s\n", d_MCX);
   62:         printf("    1: %s\n", d_VCX);
   63: 
   64:         return;
   65:     }
   66:     else if ((*s_etat_processus).test_instruction == 'Y')
   67:     {
   68:         (*s_etat_processus).nombre_arguments = -1;
   69:         return;
   70:     }
   71: 
   72:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   73:     {
   74:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
   75:         {
   76:             return;
   77:         }
   78:     }
   79: 
   80:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
   81:             &s_objet_argument) == d_erreur)
   82:     {
   83:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
   84:         return;
   85:     }
   86: 
   87: /*
   88: --------------------------------------------------------------------------------
   89:   L'argument est une matrice carrée
   90: --------------------------------------------------------------------------------
   91: */
   92: 
   93:     if (((*s_objet_argument).type == MIN) ||
   94:             ((*s_objet_argument).type == MRL) ||
   95:             ((*s_objet_argument).type == MCX))
   96:     {
   97:         if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes !=
   98:                 (*((struct_matrice *) (*s_objet_argument).objet))
   99:                 .nombre_colonnes)
  100:         {
  101:             liberation(s_etat_processus, s_objet_argument);
  102: 
  103:             (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
  104:             return;
  105:         }
  106: 
  107:         if ((s_objet_resultat_1 = allocation(s_etat_processus, VCX)) == NULL)
  108:         {
  109:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  110:             return;
  111:         }
  112: 
  113:         if ((s_objet_resultat_2 = allocation(s_etat_processus, MCX)) == NULL)
  114:         {
  115:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  116:             return;
  117:         }
  118: 
  119:         valeurs_propres(s_etat_processus,
  120:                 (struct_matrice *) (*s_objet_argument).objet,
  121:                 (struct_vecteur *) (*s_objet_resultat_1).objet,
  122:                 (struct_matrice *) (*s_objet_resultat_2).objet, NULL);
  123: 
  124:         if ((*s_etat_processus).erreur_systeme != d_es)
  125:         {
  126:             return;
  127:         }
  128: 
  129:         if (((*s_etat_processus).exception != d_ep) ||
  130:                 ((*s_etat_processus).erreur_execution != d_ex))
  131:         {
  132:             liberation(s_etat_processus, s_objet_argument);
  133:             liberation(s_etat_processus, s_objet_resultat_1);
  134:             liberation(s_etat_processus, s_objet_resultat_2);
  135:             return;
  136:         }
  137:     }
  138: 
  139: /*
  140: --------------------------------------------------------------------------------
  141:   Type incompatible
  142: --------------------------------------------------------------------------------
  143: */
  144: 
  145:     else
  146:     {
  147:         liberation(s_etat_processus, s_objet_argument);
  148: 
  149:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  150:         return;
  151:     }
  152: 
  153:     liberation(s_etat_processus, s_objet_argument);
  154: 
  155:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  156:             s_objet_resultat_2) == d_erreur)
  157:     {
  158:         return;
  159:     }
  160: 
  161:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  162:             s_objet_resultat_1) == d_erreur)
  163:     {
  164:         return;
  165:     }
  166: 
  167:     return;
  168: }
  169: 
  170: 
  171: /*
  172: ================================================================================
  173:   Fonction 'lsq'
  174: ================================================================================
  175:   Entrées : pointeur sur une structure struct_processus
  176: --------------------------------------------------------------------------------
  177:   Sorties :
  178: --------------------------------------------------------------------------------
  179:   Effets de bord : néant
  180: ================================================================================
  181: */
  182: 
  183: void
  184: instruction_lsq(struct_processus *s_etat_processus)
  185: {
  186:     struct_objet                *s_objet_argument_1;
  187:     struct_objet                *s_objet_argument_2;
  188:     struct_objet                *s_objet_resultat;
  189: 
  190:     struct_matrice              s_matrice_tampon_b;
  191:     struct_matrice              s_matrice_tampon_x;
  192: 
  193:     unsigned long               i;
  194: 
  195:     (*s_etat_processus).erreur_execution = d_ex;
  196: 
  197:     if ((*s_etat_processus).affichage_arguments == 'Y')
  198:     {
  199:         printf("\n  LSQ ");
  200:         
  201:         if ((*s_etat_processus).langue == 'F')
  202:         {
  203:             printf("(moindres carrés)\n\n");
  204:         }
  205:         else
  206:         {
  207:             printf("(least squares)\n\n");
  208:         }
  209: 
  210:         printf("    2: %s, %s\n", d_VIN, d_VRL);
  211:         printf("    1: %s, %s\n", d_MIN, d_MRL);
  212:         printf("->  1: %s\n\n", d_VRL);
  213: 
  214:         printf("    2: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
  215:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  216:         printf("->  1: %s\n\n", d_VCX);
  217: 
  218:         printf("    2: %s, %s\n", d_MIN, d_MRL);
  219:         printf("    1: %s, %s\n", d_MIN, d_MRL);
  220:         printf("->  1: %s\n\n", d_MRL);
  221: 
  222:         printf("    2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  223:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  224:         printf("->  1: %s\n", d_MCX);
  225: 
  226:         return;
  227:     }
  228:     else if ((*s_etat_processus).test_instruction == 'Y')
  229:     {
  230:         (*s_etat_processus).nombre_arguments = -1;
  231:         return;
  232:     }
  233: 
  234:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  235:     {
  236:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  237:         {
  238:             return;
  239:         }
  240:     }
  241: 
  242:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  243:             &s_objet_argument_1) == d_erreur)
  244:     {
  245:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  246:         return;
  247:     }
  248: 
  249:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  250:             &s_objet_argument_2) == d_erreur)
  251:     {
  252:         liberation(s_etat_processus, s_objet_argument_1);
  253: 
  254:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  255:         return;
  256:     }
  257: 
  258: /*
  259: --------------------------------------------------------------------------------
  260:   Vecteur et matrice
  261: --------------------------------------------------------------------------------
  262: */
  263: 
  264:     /*
  265:      * Résultat réel
  266:      */
  267: 
  268:     if ((((*s_objet_argument_1).type == MIN) ||
  269:             ((*s_objet_argument_1).type == MRL)) &&
  270:             (((*s_objet_argument_2).type == VIN) ||
  271:             ((*s_objet_argument_2).type == VRL)))
  272:     {
  273:         if ((*((struct_vecteur *) (*s_objet_argument_2).objet)).taille !=
  274:                 (*((struct_matrice *) (*s_objet_argument_1).objet))
  275:                 .nombre_lignes)
  276:         {
  277:             liberation(s_etat_processus, s_objet_argument_1);
  278:             liberation(s_etat_processus, s_objet_argument_2);
  279: 
  280:             (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
  281:             return;
  282:         }
  283: 
  284:         if ((*s_objet_argument_2).type == VIN)
  285:         {
  286:             s_matrice_tampon_b.type = 'I';
  287:             s_matrice_tampon_b.nombre_lignes = (*((struct_vecteur *)
  288:                     (*s_objet_argument_2).objet)).taille;
  289:             s_matrice_tampon_b.nombre_colonnes = 1;
  290: 
  291:             if ((s_matrice_tampon_b.tableau = malloc(s_matrice_tampon_b
  292:                     .nombre_lignes * sizeof(integer8 *))) == NULL)
  293:             {
  294:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  295:                 return;
  296:             }
  297: 
  298:             for(i = 0; i < s_matrice_tampon_b.nombre_lignes; i++)
  299:             {
  300:                 if ((((integer8 **) s_matrice_tampon_b.tableau)[i] =
  301:                         malloc(sizeof(integer8))) == NULL)
  302:                 {
  303:                     (*s_etat_processus).erreur_systeme =
  304:                             d_es_allocation_memoire;
  305:                     return;
  306:                 }
  307: 
  308:                 ((integer8 **) s_matrice_tampon_b.tableau)[i][0] =
  309:                         ((integer8 *) (*((struct_vecteur *)
  310:                         (*s_objet_argument_2).objet)).tableau)[i];
  311:             }
  312:         }
  313:         else
  314:         {
  315:             s_matrice_tampon_b.type = 'R';
  316:             s_matrice_tampon_b.nombre_lignes = (*((struct_vecteur *)
  317:                     (*s_objet_argument_2).objet)).taille;
  318:             s_matrice_tampon_b.nombre_colonnes = 1;
  319: 
  320:             if ((s_matrice_tampon_b.tableau = malloc(s_matrice_tampon_b
  321:                     .nombre_lignes * sizeof(real8 *))) == NULL)
  322:             {
  323:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  324:                 return;
  325:             }
  326: 
  327:             for(i = 0; i < s_matrice_tampon_b.nombre_lignes; i++)
  328:             {
  329:                 if ((((real8 **) s_matrice_tampon_b.tableau)[i] =
  330:                         malloc(sizeof(real8))) == NULL)
  331:                 {
  332:                     (*s_etat_processus).erreur_systeme =
  333:                             d_es_allocation_memoire;
  334:                     return;
  335:                 }
  336: 
  337:                 ((real8 **) s_matrice_tampon_b.tableau)[i][0] =
  338:                         ((real8 *) (*((struct_vecteur *)
  339:                         (*s_objet_argument_2).objet)).tableau)[i];
  340:             }
  341:         }
  342: 
  343:         moindres_carres(s_etat_processus,
  344:                 (struct_matrice *) (*s_objet_argument_1).objet,
  345:                 &s_matrice_tampon_b, &s_matrice_tampon_x);
  346: 
  347:         if ((*s_objet_argument_2).type == VIN)
  348:         {
  349:             for(i = 0; i < s_matrice_tampon_b.nombre_lignes; i++)
  350:             {
  351:                 free(((integer8 **) s_matrice_tampon_b.tableau)[i]);
  352:             }
  353:         }
  354:         else
  355:         {
  356:             for(i = 0; i < s_matrice_tampon_b.nombre_lignes; i++)
  357:             {
  358:                 free(((real8 **) s_matrice_tampon_b.tableau)[i]);
  359:             }
  360:         }
  361: 
  362:         free(s_matrice_tampon_b.tableau);
  363: 
  364:         if ((*s_etat_processus).erreur_systeme != d_es)
  365:         {
  366:             return;
  367:         }
  368: 
  369:         if (((*s_etat_processus).exception != d_ep) ||
  370:                 ((*s_etat_processus).erreur_execution != d_ex))
  371:         {
  372:             liberation(s_etat_processus, s_objet_argument_1);
  373:             liberation(s_etat_processus, s_objet_argument_2);
  374:             return;
  375:         }
  376: 
  377:         if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL)
  378:         {
  379:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  380:             return;
  381:         }
  382: 
  383:         (*((struct_vecteur *) (*s_objet_resultat).objet)).taille =
  384:                 s_matrice_tampon_x.nombre_lignes;
  385: 
  386:         if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau =
  387:                 malloc((*((struct_vecteur *) (*s_objet_resultat).objet)).taille
  388:                 * sizeof(real8))) == NULL)
  389:         {
  390:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  391:             return;
  392:         }
  393: 
  394:         for(i = 0; i < (*((struct_vecteur *) (*s_objet_resultat).objet)).taille;
  395:                 i++)
  396:         {
  397:             ((real8 *) (*((struct_vecteur *) (*s_objet_resultat).objet))
  398:                     .tableau)[i] = ((real8 **) s_matrice_tampon_x.tableau)
  399:                     [i][0];
  400:             free(((real8 **) s_matrice_tampon_x.tableau)[i]);
  401:         }
  402: 
  403:         free(s_matrice_tampon_x.tableau);
  404:     }
  405: 
  406:     /*
  407:      * Résultat complexe
  408:      */
  409: 
  410:     else if ((((*s_objet_argument_1).type == MCX) &&
  411:             (((*s_objet_argument_2).type == VIN) ||
  412:             ((*s_objet_argument_2).type == VRL) ||
  413:             ((*s_objet_argument_2).type == VCX))) ||
  414:             (((*s_objet_argument_2).type == VCX) &&
  415:             (((*s_objet_argument_1).type == MIN) ||
  416:             ((*s_objet_argument_1).type == MRL))))
  417:     {
  418:         if ((*((struct_vecteur *) (*s_objet_argument_2).objet)).taille !=
  419:                 (*((struct_matrice *) (*s_objet_argument_1).objet))
  420:                 .nombre_lignes)
  421:         {
  422:             liberation(s_etat_processus, s_objet_argument_1);
  423:             liberation(s_etat_processus, s_objet_argument_2);
  424: 
  425:             (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
  426:             return;
  427:         }
  428: 
  429:         if ((*s_objet_argument_2).type == VIN)
  430:         {
  431:             s_matrice_tampon_b.type = 'I';
  432:             s_matrice_tampon_b.nombre_lignes = (*((struct_vecteur *)
  433:                     (*s_objet_argument_2).objet)).taille;
  434:             s_matrice_tampon_b.nombre_colonnes = 1;
  435: 
  436:             if ((s_matrice_tampon_b.tableau = malloc(s_matrice_tampon_b
  437:                     .nombre_lignes * sizeof(integer8 *))) == NULL)
  438:             {
  439:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  440:                 return;
  441:             }
  442: 
  443:             for(i = 0; i < s_matrice_tampon_b.nombre_lignes; i++)
  444:             {
  445:                 if ((((integer8 **) s_matrice_tampon_b.tableau)[i] =
  446:                         malloc(sizeof(integer8))) == NULL)
  447:                 {
  448:                     (*s_etat_processus).erreur_systeme =
  449:                             d_es_allocation_memoire;
  450:                     return;
  451:                 }
  452: 
  453:                 ((integer8 **) s_matrice_tampon_b.tableau)[i][0] =
  454:                         ((integer8 *) (*((struct_vecteur *)
  455:                         (*s_objet_argument_2).objet)).tableau)[i];
  456:             }
  457:         }
  458:         else if ((*s_objet_argument_2).type == VRL)
  459:         {
  460:             s_matrice_tampon_b.type = 'R';
  461:             s_matrice_tampon_b.nombre_lignes = (*((struct_vecteur *)
  462:                     (*s_objet_argument_2).objet)).taille;
  463:             s_matrice_tampon_b.nombre_colonnes = 1;
  464: 
  465:             if ((s_matrice_tampon_b.tableau = malloc(s_matrice_tampon_b
  466:                     .nombre_lignes * sizeof(real8 *))) == NULL)
  467:             {
  468:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  469:                 return;
  470:             }
  471: 
  472:             for(i = 0; i < s_matrice_tampon_b.nombre_lignes; i++)
  473:             {
  474:                 if ((((real8 **) s_matrice_tampon_b.tableau)[i] =
  475:                         malloc(sizeof(real8))) == NULL)
  476:                 {
  477:                     (*s_etat_processus).erreur_systeme =
  478:                             d_es_allocation_memoire;
  479:                     return;
  480:                 }
  481: 
  482:                 ((real8 **) s_matrice_tampon_b.tableau)[i][0] =
  483:                         ((real8 *) (*((struct_vecteur *)
  484:                         (*s_objet_argument_2).objet)).tableau)[i];
  485:             }
  486:         }
  487:         else
  488:         {
  489:             s_matrice_tampon_b.type = 'C';
  490:             s_matrice_tampon_b.nombre_lignes = (*((struct_vecteur *)
  491:                     (*s_objet_argument_2).objet)).taille;
  492:             s_matrice_tampon_b.nombre_colonnes = 1;
  493: 
  494:             if ((s_matrice_tampon_b.tableau = malloc(s_matrice_tampon_b
  495:                     .nombre_lignes * sizeof(struct_complexe16 *))) == NULL)
  496:             {
  497:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  498:                 return;
  499:             }
  500: 
  501:             for(i = 0; i < s_matrice_tampon_b.nombre_lignes; i++)
  502:             {
  503:                 if ((((struct_complexe16 **) s_matrice_tampon_b.tableau)[i] =
  504:                         malloc(sizeof(struct_complexe16))) == NULL)
  505:                 {
  506:                     (*s_etat_processus).erreur_systeme =
  507:                             d_es_allocation_memoire;
  508:                     return;
  509:                 }
  510: 
  511:                 ((struct_complexe16 **) s_matrice_tampon_b.tableau)[i][0]
  512:                         .partie_reelle = ((struct_complexe16 *)
  513:                         (*((struct_vecteur *) (*s_objet_argument_2).objet))
  514:                         .tableau)[i].partie_reelle;
  515:                 ((struct_complexe16 **) s_matrice_tampon_b.tableau)[i][0]
  516:                         .partie_imaginaire = ((struct_complexe16 *)
  517:                         (*((struct_vecteur *) (*s_objet_argument_2).objet))
  518:                         .tableau)[i].partie_imaginaire;
  519:             }
  520:         }
  521: 
  522:         moindres_carres(s_etat_processus,
  523:                 (struct_matrice *) (*s_objet_argument_1).objet,
  524:                 &s_matrice_tampon_b, &s_matrice_tampon_x);
  525: 
  526:         if ((*s_objet_argument_2).type == VIN)
  527:         {
  528:             for(i = 0; i < s_matrice_tampon_b.nombre_lignes; i++)
  529:             {
  530:                 free(((integer8 **) s_matrice_tampon_b.tableau)[i]);
  531:             }
  532:         }
  533:         else if ((*s_objet_argument_2).type == VRL)
  534:         {
  535:             for(i = 0; i < s_matrice_tampon_b.nombre_lignes; i++)
  536:             {
  537:                 free(((real8 **) s_matrice_tampon_b.tableau)[i]);
  538:             }
  539:         }
  540:         else
  541:         {
  542:             for(i = 0; i < s_matrice_tampon_b.nombre_lignes; i++)
  543:             {
  544:                 free(((struct_complexe16 **) s_matrice_tampon_b.tableau)[i]);
  545:             }
  546:         }
  547: 
  548:         free(s_matrice_tampon_b.tableau);
  549: 
  550:         if ((*s_etat_processus).erreur_systeme != d_es)
  551:         {
  552:             return;
  553:         }
  554: 
  555:         if (((*s_etat_processus).exception != d_ep) ||
  556:                 ((*s_etat_processus).erreur_execution != d_ex))
  557:         {
  558:             liberation(s_etat_processus, s_objet_argument_1);
  559:             liberation(s_etat_processus, s_objet_argument_2);
  560:             return;
  561:         }
  562: 
  563:         if ((s_objet_resultat = allocation(s_etat_processus, VCX)) == NULL)
  564:         {
  565:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  566:             return;
  567:         }
  568: 
  569:         (*((struct_vecteur *) (*s_objet_resultat).objet)).taille =
  570:                 s_matrice_tampon_x.nombre_lignes;
  571: 
  572:         if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau =
  573:                 malloc((*((struct_vecteur *) (*s_objet_resultat).objet)).taille
  574:                 * sizeof(struct_complexe16))) == NULL)
  575:         {
  576:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  577:             return;
  578:         }
  579: 
  580:         for(i = 0; i < (*((struct_vecteur *) (*s_objet_resultat).objet)).taille;
  581:                 i++)
  582:         {
  583:             ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_resultat)
  584:                     .objet)).tableau)[i].partie_reelle = ((struct_complexe16 **)
  585:                     s_matrice_tampon_x.tableau)[i][0].partie_reelle;
  586:             ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_resultat)
  587:                     .objet)).tableau)[i].partie_imaginaire =
  588:                     ((struct_complexe16 **) s_matrice_tampon_x.tableau)[i][0]
  589:                     .partie_imaginaire;
  590:             free(((real8 **) s_matrice_tampon_x.tableau)[i]);
  591:         }
  592: 
  593:         free(s_matrice_tampon_x.tableau);
  594:     }
  595: 
  596: /*
  597: --------------------------------------------------------------------------------
  598:   Matrices
  599: --------------------------------------------------------------------------------
  600: */
  601: 
  602:     /*
  603:      * Résultat réel
  604:      */
  605: 
  606:     else if ((((*s_objet_argument_1).type == MIN) ||
  607:             ((*s_objet_argument_1).type == MRL)) &&
  608:             (((*s_objet_argument_2).type == MIN) ||
  609:             ((*s_objet_argument_2).type == MRL)))
  610:     {
  611:         if ((*((struct_matrice *) (*s_objet_argument_2).objet)).nombre_lignes !=
  612:                 (*((struct_matrice *) (*s_objet_argument_1).objet))
  613:                 .nombre_lignes)
  614:         {
  615:             liberation(s_etat_processus, s_objet_argument_1);
  616:             liberation(s_etat_processus, s_objet_argument_2);
  617: 
  618:             (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
  619:             return;
  620:         }
  621: 
  622:         moindres_carres(s_etat_processus,
  623:                 (struct_matrice *) (*s_objet_argument_1).objet,
  624:                 (struct_matrice *) (*s_objet_argument_2).objet,
  625:                 &s_matrice_tampon_x);
  626: 
  627:         if ((*s_etat_processus).erreur_systeme != d_es)
  628:         {
  629:             return;
  630:         }
  631: 
  632:         if (((*s_etat_processus).exception != d_ep) ||
  633:                 ((*s_etat_processus).erreur_execution != d_ex))
  634:         {
  635:             liberation(s_etat_processus, s_objet_argument_1);
  636:             liberation(s_etat_processus, s_objet_argument_2);
  637:             return;
  638:         }
  639: 
  640:         if ((s_objet_resultat = allocation(s_etat_processus, MRL)) == NULL)
  641:         {
  642:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  643:             return;
  644:         }
  645: 
  646:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
  647:                 s_matrice_tampon_x.nombre_lignes;
  648:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
  649:                 s_matrice_tampon_x.nombre_colonnes;
  650:         (*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
  651:                 s_matrice_tampon_x.tableau;
  652:     }
  653: 
  654:     /*
  655:      * Résultat complexe
  656:      */
  657: 
  658:     else if ((((*s_objet_argument_1).type == MCX) &&
  659:             (((*s_objet_argument_2).type == MIN) ||
  660:             ((*s_objet_argument_2).type == MRL) ||
  661:             ((*s_objet_argument_2).type == MCX))) ||
  662:             (((*s_objet_argument_2).type == MCX) &&
  663:             (((*s_objet_argument_1).type == MIN) ||
  664:             ((*s_objet_argument_1).type == MRL))))
  665:     {
  666:         if ((*((struct_matrice *) (*s_objet_argument_2).objet)).nombre_lignes !=
  667:                 (*((struct_matrice *) (*s_objet_argument_1).objet))
  668:                 .nombre_lignes)
  669:         {
  670:             liberation(s_etat_processus, s_objet_argument_1);
  671:             liberation(s_etat_processus, s_objet_argument_2);
  672: 
  673:             (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
  674:             return;
  675:         }
  676: 
  677:         moindres_carres(s_etat_processus,
  678:                 (struct_matrice *) (*s_objet_argument_1).objet,
  679:                 (struct_matrice *) (*s_objet_argument_2).objet,
  680:                 &s_matrice_tampon_x);
  681: 
  682:         if ((*s_etat_processus).erreur_systeme != d_es)
  683:         {
  684:             return;
  685:         }
  686: 
  687:         if (((*s_etat_processus).exception != d_ep) ||
  688:                 ((*s_etat_processus).erreur_execution != d_ex))
  689:         {
  690:             liberation(s_etat_processus, s_objet_argument_1);
  691:             liberation(s_etat_processus, s_objet_argument_2);
  692:             return;
  693:         }
  694: 
  695:         if ((s_objet_resultat = allocation(s_etat_processus, MCX)) == NULL)
  696:         {
  697:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  698:             return;
  699:         }
  700: 
  701:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
  702:                 s_matrice_tampon_x.nombre_lignes;
  703:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
  704:                 s_matrice_tampon_x.nombre_colonnes;
  705:         (*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
  706:                 s_matrice_tampon_x.tableau;
  707:     }
  708: 
  709: /*
  710: --------------------------------------------------------------------------------
  711:   Types icompatibles avec la fonction LSQ
  712: --------------------------------------------------------------------------------
  713: */
  714: 
  715:     else
  716:     {
  717:         liberation(s_etat_processus, s_objet_argument_1);
  718:         liberation(s_etat_processus, s_objet_argument_2);
  719: 
  720:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  721:         return;
  722:     }
  723: 
  724:     liberation(s_etat_processus, s_objet_argument_1);
  725:     liberation(s_etat_processus, s_objet_argument_2);
  726: 
  727:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  728:             s_objet_resultat) == d_erreur)
  729:     {
  730:         return;
  731:     }
  732: 
  733:     return;
  734: }
  735: 
  736: 
  737: /*
  738: ================================================================================
  739:   Fonction 'logscale'
  740: ================================================================================
  741:   Entrées : pointeur sur une structure struct_processus
  742: --------------------------------------------------------------------------------
  743:   Sorties :
  744: --------------------------------------------------------------------------------
  745:   Effets de bord : néant
  746: ================================================================================
  747: */
  748: 
  749: void
  750: instruction_logscale(struct_processus *s_etat_processus)
  751: {
  752:     logical1                        presence[3];
  753:     logical1                        systeme_auxiliaire;
  754:     logical1                        systeme_principal;
  755: 
  756:     struct_liste_chainee            *l_element_courant;
  757: 
  758:     struct_objet                    *s_objet;
  759: 
  760:     unsigned char                   *tampon;
  761: 
  762:     (*s_etat_processus).erreur_execution = d_ex;
  763: 
  764:     if ((*s_etat_processus).affichage_arguments == 'Y')
  765:     {
  766:         printf("\n  LOGSCALE ");
  767: 
  768:         if ((*s_etat_processus).langue == 'F')
  769:         {
  770:             printf("(définition des axes)\n\n");
  771:         }
  772:         else
  773:         {
  774:             printf("(definitions of axes)\n\n");
  775:         }
  776: 
  777:         printf("    1: %s\n\n", d_LST);
  778: 
  779:         printf("    1: %s\n", d_NOM);
  780: 
  781:         if ((*s_etat_processus).langue == 'F')
  782:         {
  783:             printf("  Utilisation :\n\n");
  784:         }
  785:         else
  786:         {
  787:             printf("  Usage:\n\n");
  788:         }
  789: 
  790:         printf("    { X Z } LOGSCALE\n");
  791:         printf("    'Y' LOGSCALE\n");
  792: 
  793:         return;
  794:     }
  795:     else if ((*s_etat_processus).test_instruction == 'Y')
  796:     {
  797:         (*s_etat_processus).nombre_arguments = -1;
  798:         return;
  799:     }
  800: 
  801:     if ((*s_etat_processus).l_base_pile == NULL)
  802:     {
  803:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  804:         return;
  805:     }
  806: 
  807:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  808:     {
  809:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  810:         {
  811:             return;
  812:         }
  813:     }
  814: 
  815:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  816:             &s_objet) == d_erreur)
  817:     {
  818:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  819:         return;
  820:     }
  821: 
  822:     if ((*s_objet).type == NOM)
  823:     {
  824:         tampon = conversion_majuscule((*((struct_nom *) (*s_objet).objet)).nom);
  825: 
  826:         if (tampon == NULL)
  827:         {
  828:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  829:             return;
  830:         }
  831: 
  832:         if ((strcmp(tampon, "X") != 0) && (strcmp(tampon, "Y") != 0) &&
  833:                 (strcmp(tampon, "Z") != 0))
  834:         {
  835:             liberation(s_etat_processus, s_objet);
  836: 
  837:             free(tampon);
  838: 
  839:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  840:             return;
  841:         }
  842: 
  843:         if (tampon[0] == 'X')
  844:         {
  845:             (*s_etat_processus).echelle_log_x = d_vrai;
  846:         }
  847:         else if (tampon[0] == 'Y')
  848:         {
  849:             (*s_etat_processus).echelle_log_y = d_vrai;
  850:         }
  851:         else
  852:         {
  853:             (*s_etat_processus).echelle_log_z = d_vrai;
  854:         }
  855: 
  856:         free(tampon);
  857:     }
  858:     else if ((*s_objet).type == LST)
  859:     {
  860:         if ((*s_etat_processus).systeme_axes == 0)
  861:         {
  862:             systeme_principal = d_vrai;
  863:             systeme_auxiliaire = d_faux;
  864:         }
  865:         else
  866:         {
  867:             systeme_principal = d_faux;
  868:             systeme_auxiliaire = d_vrai;
  869:         }
  870: 
  871:         presence[0] = d_faux;
  872:         presence[1] = d_faux;
  873:         presence[2] = d_faux;
  874: 
  875:         l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
  876: 
  877:         if (l_element_courant == NULL)
  878:         {
  879:             if (systeme_principal == d_vrai)
  880:             {
  881:                 (*s_etat_processus).echelle_log_x = d_faux;
  882:                 (*s_etat_processus).echelle_log_y = d_faux;
  883:                 (*s_etat_processus).echelle_log_z = d_faux;
  884:             }
  885:             else
  886:             {
  887:                 (*s_etat_processus).echelle_log_x2 = d_faux;
  888:                 (*s_etat_processus).echelle_log_y2 = d_faux;
  889:                 (*s_etat_processus).echelle_log_z2 = d_faux;
  890:             }
  891:         }
  892:         else
  893:         {
  894:             while(l_element_courant != NULL)
  895:             {
  896:                 if ((*(*l_element_courant).donnee).type != NOM)
  897:                 {
  898:                     liberation(s_etat_processus, s_objet);
  899: 
  900:                     (*s_etat_processus).erreur_execution =
  901:                             d_ex_argument_invalide;
  902:                     return;
  903:                 }
  904: 
  905:                 tampon = conversion_majuscule((*((struct_nom *)
  906:                         (*(*l_element_courant).donnee).objet)).nom);
  907: 
  908:                 if ((strcmp(tampon, "X") != 0) && (strcmp(tampon, "Y") != 0) &&
  909:                         (strcmp(tampon, "Z") != 0))
  910:                 {
  911:                     liberation(s_etat_processus, s_objet);
  912:                     free(tampon);
  913: 
  914:                     (*s_etat_processus).erreur_execution =
  915:                             d_ex_argument_invalide;
  916:                     return;
  917:                 }
  918: 
  919:                 if (tampon[0] == 'X')
  920:                 {
  921:                     if (presence[0] == d_vrai)
  922:                     {
  923:                         liberation(s_etat_processus, s_objet);
  924:                         free(tampon);
  925: 
  926:                         (*s_etat_processus).erreur_execution =
  927:                                 d_ex_argument_invalide;
  928:                         return;
  929:                     }
  930: 
  931:                     if (systeme_principal == d_vrai)
  932:                     {
  933:                         (*s_etat_processus).echelle_log_x = d_vrai;
  934:                     }
  935: 
  936:                     if (systeme_auxiliaire == d_vrai)
  937:                     {
  938:                         (*s_etat_processus).echelle_log_x2 = d_vrai;
  939:                     }
  940: 
  941:                     presence[0] = d_vrai;
  942:                 }
  943:                 else if (tampon[0] == 'Y')
  944:                 {
  945:                     if (presence[1] == d_vrai)
  946:                     {
  947:                         liberation(s_etat_processus, s_objet);
  948:                         free(tampon);
  949: 
  950:                         (*s_etat_processus).erreur_execution =
  951:                                 d_ex_argument_invalide;
  952:                         return;
  953:                     }
  954: 
  955:                     if (systeme_principal == d_vrai)
  956:                     {
  957:                         (*s_etat_processus).echelle_log_y = d_vrai;
  958:                     }
  959: 
  960:                     if (systeme_auxiliaire == d_vrai)
  961:                     {
  962:                         (*s_etat_processus).echelle_log_y2 = d_vrai;
  963:                     }
  964: 
  965:                     presence[1] = d_vrai;
  966:                 }
  967:                 else
  968:                 {
  969:                     if (presence[2] == d_vrai)
  970:                     {
  971:                         liberation(s_etat_processus, s_objet);
  972:                         free(tampon);
  973: 
  974:                         (*s_etat_processus).erreur_execution =
  975:                                 d_ex_argument_invalide;
  976:                         return;
  977:                     }
  978: 
  979:                     if (systeme_principal == d_vrai)
  980:                     {
  981:                         (*s_etat_processus).echelle_log_z = d_vrai;
  982:                     }
  983: 
  984:                     if (systeme_auxiliaire == d_vrai)
  985:                     {
  986:                         (*s_etat_processus).echelle_log_z2 = d_vrai;
  987:                     }
  988: 
  989:                     presence[2] = d_vrai;
  990:                 }
  991: 
  992:                 l_element_courant = (*l_element_courant).suivant;
  993:                 free(tampon);
  994:             }
  995:         }
  996:     }
  997:     else
  998:     {
  999:         liberation(s_etat_processus, s_objet);
 1000: 
 1001:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1002:         return;
 1003:     }
 1004: 
 1005:     liberation(s_etat_processus, s_objet);
 1006: 
 1007:     if (test_cfsf(s_etat_processus, 52) == d_faux)
 1008:     {
 1009:         if ((*s_etat_processus).fichiers_graphiques != NULL)
 1010:         {
 1011:             appel_gnuplot(s_etat_processus, 'N');
 1012:         }
 1013:     }
 1014: 
 1015:     return;
 1016: }
 1017: 
 1018: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>