Annotation of rpl/src/instructions_l3.c, revision 1.1
1.1 ! bertrand 1: /*
! 2: ================================================================================
! 3: RPL/2 (R) version 4.0.9
! 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>