![]() ![]() | ![]() |
1.1 bertrand 1: /*
2: ================================================================================
1.2 ! bertrand 3: RPL/2 (R) version 4.0.10
1.1 bertrand 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 'pcov'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_pcov(struct_processus *s_etat_processus)
40: {
41: integer8 nombre_colonnes;
42:
43: logical1 erreur;
44: logical1 presence_variable;
45:
46: long i;
47:
48: struct_objet *s_objet_statistique;
49: struct_objet *s_objet_resultat;
50:
51: (*s_etat_processus).erreur_execution = d_ex;
52:
53: if ((*s_etat_processus).affichage_arguments == 'Y')
54: {
55: printf("\n PCOV ");
56:
57: if ((*s_etat_processus).langue == 'F')
58: {
59: printf("(covariance d'une population)\n\n");
60: }
61: else
62: {
63: printf("(population covariance)\n\n");
64: }
65:
66: printf("-> 1: %s\n", d_REL);
67:
68: return;
69: }
70: else if ((*s_etat_processus).test_instruction == 'Y')
71: {
72: (*s_etat_processus).nombre_arguments = -1;
73: return;
74: }
75:
76: if (test_cfsf(s_etat_processus, 31) == d_vrai)
77: {
78: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
79: {
80: return;
81: }
82: }
83:
84: /*
85: * Recherche d'une variable globale référencée par SIGMA
86: */
87:
88: if (recherche_variable(s_etat_processus, ds_sdat) == d_faux)
89: {
90: /*
91: * Aucune variable SIGMA
92: */
93:
94: (*s_etat_processus).erreur_systeme = d_es;
95: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
96: return;
97: }
98: else
99: {
100: /*
101: * Il existe une variable locale SIGMA. Reste à vérifier l'existence
102: * d'une variable SIGMA globale...
103: */
104:
105: i = (*s_etat_processus).position_variable_courante;
106: presence_variable = d_faux;
107:
108: while(i >= 0)
109: {
110: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
111: ds_sdat) == 0) && ((*s_etat_processus)
112: .s_liste_variables[i].niveau == 1))
113: {
114: presence_variable = d_vrai;
115: break;
116: }
117:
118: i--;
119: }
120:
121: if (presence_variable == d_faux)
122: {
123: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
124: return;
125: }
126: else
127: {
128: (*s_etat_processus).position_variable_courante = i;
129:
130: if (((*s_etat_processus).s_liste_variables[i]).objet == NULL)
131: {
132: (*s_etat_processus).erreur_execution =
133: d_ex_variable_partagee;
134: return;
135: }
136:
137: if (((*((*s_etat_processus).s_liste_variables
138: [(*s_etat_processus).position_variable_courante].objet))
139: .type != MIN) && ((*((*s_etat_processus)
140: .s_liste_variables[(*s_etat_processus)
141: .position_variable_courante].objet)).type != MRL))
142: {
143: (*s_etat_processus).erreur_execution =
144: d_ex_matrice_statistique_invalide;
145: return;
146: }
147:
148: nombre_colonnes = (*((struct_matrice *) (*((*s_etat_processus)
149: .s_liste_variables[(*s_etat_processus)
150: .position_variable_courante].objet)).objet))
151: .nombre_colonnes;
152: }
153: }
154:
155: s_objet_statistique = ((*s_etat_processus).s_liste_variables
156: [(*s_etat_processus).position_variable_courante]).objet;
157:
158: if (((*s_objet_statistique).type == MIN) ||
159: ((*s_objet_statistique).type == MRL))
160: {
161: if (((*s_etat_processus).colonne_statistique_1 < 1) ||
162: ((*s_etat_processus).colonne_statistique_2 < 1) ||
163: ((*s_etat_processus).colonne_statistique_1 > nombre_colonnes) ||
164: ((*s_etat_processus).colonne_statistique_2 > nombre_colonnes))
165: {
166: (*s_etat_processus).erreur_execution =
167: d_ex_observations_inexistantes;
168: return;
169: }
170:
171: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
172: {
173: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
174: return;
175: }
176:
177: (*((real8 *) (*s_objet_resultat).objet)) = covariance_statistique(
178: (struct_matrice *) (*s_objet_statistique).objet,
179: (*s_etat_processus).colonne_statistique_1,
180: (*s_etat_processus).colonne_statistique_2, 'N', &erreur);
181:
182: if (erreur == d_erreur)
183: {
184: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
185: return;
186: }
187: }
188: else
189: {
190: (*s_etat_processus).erreur_execution =
191: d_ex_matrice_statistique_invalide;
192: return;
193: }
194:
195: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
196: s_objet_resultat) == d_erreur)
197: {
198: return;
199: }
200:
201: return;
202: }
203:
204:
205: /*
206: ================================================================================
207: Fonction 'prlcd'
208: ================================================================================
209: Entrées :
210: --------------------------------------------------------------------------------
211: Sorties :
212: --------------------------------------------------------------------------------
213: Effets de bord : néant
214: ================================================================================
215: */
216:
217: void
218: instruction_prlcd(struct_processus *s_etat_processus)
219: {
220: (*s_etat_processus).erreur_execution = d_ex;
221:
222: if ((*s_etat_processus).affichage_arguments == 'Y')
223: {
224: printf("\n PRLCD ");
225:
226: if ((*s_etat_processus).langue == 'F')
227: {
228: printf("(impression puis destruction de la file graphique)\n\n");
229: printf(" Aucun argument\n");
230: }
231: else
232: {
233: printf("(print and purge the graphical queue)\n\n");
234: printf(" No argument\n");
235: }
236:
237: return;
238: }
239: else if ((*s_etat_processus).test_instruction == 'Y')
240: {
241: (*s_etat_processus).nombre_arguments = -1;
242: return;
243: }
244:
245: if (test_cfsf(s_etat_processus, 31) == d_vrai)
246: {
247: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
248: {
249: return;
250: }
251: }
252:
253: appel_gnuplot(s_etat_processus, 'I');
254:
255: (*s_etat_processus).exception = d_ep;
256:
257: return;
258: }
259:
260:
261: /*
262: ================================================================================
263: Fonction 'putc'
264: ================================================================================
265: Entrées :
266: --------------------------------------------------------------------------------
267: Sorties :
268: --------------------------------------------------------------------------------
269: Effets de bord : néant
270: ================================================================================
271: */
272:
273: void
274: instruction_putc(struct_processus *s_etat_processus)
275: {
276: integer8 position;
277:
278: logical1 presence_nom;
279: logical1 variable_partagee;
280:
281: struct_liste_chainee *l_element_courant;
282:
283: struct_objet *s_copie_argument_3;
284: struct_objet *s_objet_argument_1;
285: struct_objet *s_objet_argument_2;
286: struct_objet *s_objet_argument_3;
287:
288: unsigned long i;
289: unsigned long j;
290: unsigned long nombre_elements;
291:
292: void *tampon;
293:
294: (*s_etat_processus).erreur_execution = d_ex;
295:
296: if ((*s_etat_processus).affichage_arguments == 'Y')
297: {
298: printf("\n PUTC ");
299:
300: if ((*s_etat_processus).langue == 'F')
301: {
302: printf("(change une colonne)\n\n");
303: }
304: else
305: {
306: printf("(change column)\n\n");
307: }
308:
309: printf(" 3: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
310: printf(" 2: %s\n", d_LST);
311: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
312: printf("-> 1: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
313:
314: printf(" 3: %s\n", d_NOM);
315: printf(" 2: %s\n", d_LST);
316: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
317:
318: return;
319: }
320: else if ((*s_etat_processus).test_instruction == 'Y')
321: {
322: (*s_etat_processus).nombre_arguments = -1;
323: return;
324: }
325:
326: if (test_cfsf(s_etat_processus, 31) == d_vrai)
327: {
328: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
329: {
330: return;
331: }
332: }
333:
334: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
335: &s_objet_argument_1) == d_erreur)
336: {
337: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
338: return;
339: }
340:
341: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
342: &s_objet_argument_2) == d_erreur)
343: {
344: liberation(s_etat_processus, s_objet_argument_1);
345:
346: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
347: return;
348: }
349:
350: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
351: &s_objet_argument_3) == d_erreur)
352: {
353: liberation(s_etat_processus, s_objet_argument_1);
354: liberation(s_etat_processus, s_objet_argument_2);
355:
356: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
357: return;
358: }
359:
360: if (((*s_objet_argument_1).type != MIN) &&
361: ((*s_objet_argument_1).type != MRL) &&
362: ((*s_objet_argument_1).type != MCX))
363: {
364: liberation(s_etat_processus, s_objet_argument_1);
365: liberation(s_etat_processus, s_objet_argument_2);
366: liberation(s_etat_processus, s_objet_argument_3);
367:
368: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
369: return;
370: }
371:
372: if ((*s_objet_argument_2).type != LST)
373: {
374: liberation(s_etat_processus, s_objet_argument_1);
375: liberation(s_etat_processus, s_objet_argument_2);
376: liberation(s_etat_processus, s_objet_argument_3);
377:
378: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
379: return;
380: }
381:
382: nombre_elements = 0;
383: l_element_courant = (struct_liste_chainee *) (*s_objet_argument_2).objet;
384:
385: while(l_element_courant != NULL)
386: {
387: if ((*(*l_element_courant).donnee).type != INT)
388: {
389: liberation(s_etat_processus, s_objet_argument_1);
390: liberation(s_etat_processus, s_objet_argument_2);
391: liberation(s_etat_processus, s_objet_argument_3);
392:
393: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
394: return;
395: }
396:
397: nombre_elements++;
398: l_element_courant = (*l_element_courant).suivant;
399: }
400:
401: if ((nombre_elements == 0) || (nombre_elements != (*((struct_matrice *)
402: (*s_objet_argument_1).objet)).nombre_colonnes))
403: {
404: liberation(s_etat_processus, s_objet_argument_1);
405: liberation(s_etat_processus, s_objet_argument_2);
406: liberation(s_etat_processus, s_objet_argument_3);
407:
408: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
409: return;
410: }
411:
412: variable_partagee = d_faux;
413:
414: if ((*s_objet_argument_3).type == NOM)
415: {
416: presence_nom = d_vrai;
417:
418: if (recherche_variable(s_etat_processus, (*((struct_nom *)
419: (*s_objet_argument_3).objet)).nom) == d_faux)
420: {
421: (*s_etat_processus).erreur_systeme = d_es;
422: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
423:
424: liberation(s_etat_processus, s_objet_argument_1);
425: liberation(s_etat_processus, s_objet_argument_2);
426: liberation(s_etat_processus, s_objet_argument_3);
427:
428: return;
429: }
430:
431: if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
432: .position_variable_courante].variable_verrouillee == d_vrai)
433: {
434: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
435:
436: liberation(s_etat_processus, s_objet_argument_1);
437: liberation(s_etat_processus, s_objet_argument_2);
438: liberation(s_etat_processus, s_objet_argument_3);
439:
440: return;
441: }
442:
443: liberation(s_etat_processus, s_objet_argument_3);
444: s_objet_argument_3 = (*s_etat_processus).s_liste_variables
445: [(*s_etat_processus).position_variable_courante].objet;
446:
447: if (s_objet_argument_3 == NULL)
448: {
449: if (pthread_mutex_lock(&((*(*s_etat_processus)
450: .s_liste_variables_partagees).mutex)) != 0)
451: {
452: (*s_etat_processus).erreur_systeme = d_es_processus;
453: return;
454: }
455:
456: if (recherche_variable_partagee(s_etat_processus,
457: (*s_etat_processus).s_liste_variables
458: [(*s_etat_processus).position_variable_courante].nom,
459: (*s_etat_processus).s_liste_variables
460: [(*s_etat_processus).position_variable_courante]
461: .variable_partagee, (*s_etat_processus).s_liste_variables
462: [(*s_etat_processus).position_variable_courante].origine)
463: == d_faux)
464: {
465: if (pthread_mutex_unlock(&((*(*s_etat_processus)
466: .s_liste_variables_partagees).mutex)) != 0)
467: {
468: (*s_etat_processus).erreur_systeme = d_es_processus;
469: return;
470: }
471:
472: (*s_etat_processus).erreur_systeme = d_es;
473: (*s_etat_processus).erreur_execution =
474: d_ex_variable_non_definie;
475:
476: liberation(s_etat_processus, s_objet_argument_1);
477: liberation(s_etat_processus, s_objet_argument_2);
478:
479: return;
480: }
481:
482: s_objet_argument_3 = (*(*s_etat_processus)
483: .s_liste_variables_partagees).table[(*(*s_etat_processus)
484: .s_liste_variables_partagees).position_variable].objet;
485: variable_partagee = d_vrai;
486: }
487:
488: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
489: s_objet_argument_3, 'O')) == NULL)
490: {
491: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
492: return;
493: }
494:
495: liberation(s_etat_processus, s_objet_argument_3);
496: s_objet_argument_3 = s_copie_argument_3;
497:
498: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
499: .position_variable_courante].objet = s_objet_argument_3;
500: }
501: else
502: {
503: presence_nom = d_faux;
504:
505: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
506: s_objet_argument_3, 'O')) == NULL)
507: {
508: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
509: return;
510: }
511:
512: liberation(s_etat_processus, s_objet_argument_3);
513: s_objet_argument_3 = s_copie_argument_3;
514: }
515:
516: if ((*s_objet_argument_1).type == MRL)
517: {
518: if ((*s_objet_argument_3).type == MIN)
519: {
520: // Conversion de la matrice entière en matrice réelle
521:
522: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
523: .nombre_lignes; i++)
524: {
525: tampon = (*((struct_matrice *) (*s_objet_argument_3).objet))
526: .tableau[i];
527:
528: if (((*((struct_matrice *) (*s_objet_argument_3).objet))
529: .tableau[i] = malloc((*((struct_matrice *)
530: (*s_objet_argument_3).objet)).nombre_colonnes *
531: sizeof(real8))) == NULL)
532: {
533: if (variable_partagee == d_vrai)
534: {
535: if (pthread_mutex_unlock(&((*(*s_etat_processus)
536: .s_liste_variables_partagees).mutex)) != 0)
537: {
538: (*s_etat_processus).erreur_systeme = d_es_processus;
539: return;
540: }
541: }
542:
543: (*s_etat_processus).erreur_systeme =
544: d_es_allocation_memoire;
545: return;
546: }
547:
548: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
549: .objet)).nombre_colonnes; j++)
550: {
551: ((real8 **) (*((struct_matrice *) (*s_objet_argument_3)
552: .objet)).tableau)[i][j] = (real8) (((integer8 *)
553: tampon)[j]);
554: }
555:
556: free(tampon);
557: }
558:
559: (*((struct_matrice *) (*s_objet_argument_3).objet)).type = 'R';
560: (*s_objet_argument_3).type = MRL;
561: }
562: }
563: else if ((*s_objet_argument_1).type == MCX)
564: {
565: if ((*s_objet_argument_3).type == MIN)
566: {
567: // Conversion de la matrice entière en matrice complexe
568:
569: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
570: .nombre_lignes; i++)
571: {
572: tampon = (*((struct_matrice *) (*s_objet_argument_3).objet))
573: .tableau[i];
574:
575: if (((*((struct_matrice *) (*s_objet_argument_3).objet))
576: .tableau[i] = malloc((*((struct_matrice *)
577: (*s_objet_argument_3).objet)).nombre_colonnes *
578: sizeof(complex16))) == NULL)
579: {
580: if (variable_partagee == d_vrai)
581: {
582: if (pthread_mutex_unlock(&((*(*s_etat_processus)
583: .s_liste_variables_partagees).mutex)) != 0)
584: {
585: (*s_etat_processus).erreur_systeme = d_es_processus;
586: return;
587: }
588: }
589:
590: (*s_etat_processus).erreur_systeme =
591: d_es_allocation_memoire;
592: return;
593: }
594:
595: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
596: .objet)).nombre_colonnes; j++)
597: {
598: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
599: .objet)).tableau)[i][j].partie_reelle =
600: (real8) (((integer8 *) tampon)[j]);
601: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
602: .objet)).tableau)[i][j].partie_imaginaire = 0;
603: }
604:
605: free(tampon);
606: }
607:
608: (*((struct_matrice *) (*s_objet_argument_3).objet)).type = 'C';
609: (*s_objet_argument_3).type = MCX;
610: }
611: else if ((*s_objet_argument_3).type == MRL)
612: {
613: // Conversion de la matrice réelle en matrice complexe
614:
615: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
616: .nombre_lignes; i++)
617: {
618: tampon = (*((struct_matrice *) (*s_objet_argument_3).objet))
619: .tableau[i];
620:
621: if (((*((struct_matrice *) (*s_objet_argument_3).objet))
622: .tableau[i] = malloc((*((struct_matrice *)
623: (*s_objet_argument_3).objet)).nombre_colonnes *
624: sizeof(complex16))) == NULL)
625: {
626: if (variable_partagee == d_vrai)
627: {
628: if (pthread_mutex_unlock(&((*(*s_etat_processus)
629: .s_liste_variables_partagees).mutex)) != 0)
630: {
631: (*s_etat_processus).erreur_systeme = d_es_processus;
632: return;
633: }
634: }
635:
636: (*s_etat_processus).erreur_systeme =
637: d_es_allocation_memoire;
638: return;
639: }
640:
641: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
642: .objet)).nombre_colonnes; j++)
643: {
644: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
645: .objet)).tableau)[i][j].partie_reelle =
646: ((real8 *) tampon)[j];
647: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
648: .objet)).tableau)[i][j].partie_imaginaire = 0;
649: }
650:
651: free(tampon);
652: }
653:
654: (*((struct_matrice *) (*s_objet_argument_3).objet)).type = 'C';
655: (*s_objet_argument_3).type = MCX;
656: }
657: }
658:
659: if ((*s_objet_argument_3).type == MIN)
660: {
661: if ((*((struct_matrice *) (*s_objet_argument_1).objet)).nombre_lignes
662: != (*((struct_matrice *) (*s_objet_argument_3).objet))
663: .nombre_lignes)
664: {
665: if (variable_partagee == d_vrai)
666: {
667: if (pthread_mutex_unlock(&((*(*s_etat_processus)
668: .s_liste_variables_partagees).mutex)) != 0)
669: {
670: (*s_etat_processus).erreur_systeme = d_es_processus;
671: return;
672: }
673: }
674:
675: liberation(s_etat_processus, s_objet_argument_1);
676: liberation(s_etat_processus, s_objet_argument_2);
677:
678: if (presence_nom == d_faux)
679: {
680: liberation(s_etat_processus, s_objet_argument_3);
681: }
682:
683: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
684: return;
685: }
686:
687: l_element_courant = (struct_liste_chainee *)
688: (*s_objet_argument_2).objet;
689: i = 0;
690:
691: while(l_element_courant != NULL)
692: {
693: position = (*((integer8 *) (*(*l_element_courant).donnee).objet));
694:
695: if ((position < 1) || (position > (integer8) (*((struct_matrice *)
696: (*s_objet_argument_3).objet)).nombre_colonnes))
697: {
698: if (variable_partagee == d_vrai)
699: {
700: if (pthread_mutex_unlock(&((*(*s_etat_processus)
701: .s_liste_variables_partagees).mutex)) != 0)
702: {
703: (*s_etat_processus).erreur_systeme = d_es_processus;
704: return;
705: }
706: }
707:
708: liberation(s_etat_processus, s_objet_argument_1);
709: liberation(s_etat_processus, s_objet_argument_2);
710:
711: if (presence_nom == d_faux)
712: {
713: liberation(s_etat_processus, s_objet_argument_3);
714: }
715:
716: (*s_etat_processus).erreur_execution =
717: d_ex_argument_invalide;
718: return;
719: }
720:
721: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3).objet))
722: .nombre_lignes; j++)
723: {
724: ((integer8 **) (*((struct_matrice *) (*s_objet_argument_3)
725: .objet)).tableau)[j][position - 1] = ((integer8 **)
726: (*((struct_matrice *) (*s_objet_argument_1).objet))
727: .tableau)[j][i];
728: }
729:
730: l_element_courant = (*l_element_courant).suivant;
731: i++;
732: }
733: }
734: else if ((*s_objet_argument_3).type == MRL)
735: {
736: if ((*s_objet_argument_1).type == MIN)
737: {
738: if ((*((struct_matrice *) (*s_objet_argument_1).objet))
739: .nombre_lignes != (*((struct_matrice *)
740: (*s_objet_argument_3).objet)).nombre_lignes)
741: {
742: if (variable_partagee == d_vrai)
743: {
744: if (pthread_mutex_unlock(&((*(*s_etat_processus)
745: .s_liste_variables_partagees).mutex)) != 0)
746: {
747: (*s_etat_processus).erreur_systeme = d_es_processus;
748: return;
749: }
750: }
751:
752: liberation(s_etat_processus, s_objet_argument_1);
753: liberation(s_etat_processus, s_objet_argument_2);
754:
755: if (presence_nom == d_faux)
756: {
757: liberation(s_etat_processus, s_objet_argument_3);
758: }
759:
760: (*s_etat_processus).erreur_execution =
761: d_ex_dimensions_invalides;
762: return;
763: }
764:
765: l_element_courant = (struct_liste_chainee *)
766: (*s_objet_argument_2).objet;
767: i = 0;
768:
769: while(l_element_courant != NULL)
770: {
771: position = (*((integer8 *) (*(*l_element_courant)
772: .donnee).objet));
773:
774: if ((position < 1) || (position > (integer8)
775: (*((struct_matrice *)(*s_objet_argument_3).objet))
776: .nombre_colonnes))
777: {
778: if (variable_partagee == d_vrai)
779: {
780: if (pthread_mutex_unlock(&((*(*s_etat_processus)
781: .s_liste_variables_partagees).mutex)) != 0)
782: {
783: (*s_etat_processus).erreur_systeme = d_es_processus;
784: return;
785: }
786: }
787:
788: liberation(s_etat_processus, s_objet_argument_1);
789: liberation(s_etat_processus, s_objet_argument_2);
790:
791: if (presence_nom == d_faux)
792: {
793: liberation(s_etat_processus, s_objet_argument_3);
794: }
795:
796: (*s_etat_processus).erreur_execution =
797: d_ex_erreur_type_argument;
798: return;
799: }
800:
801: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
802: .objet)).nombre_lignes; j++)
803: {
804: ((real8 **) (*((struct_matrice *) (*s_objet_argument_3)
805: .objet)).tableau)[j][position - 1] = (real8)
806: ((integer8 **) (*((struct_matrice *)
807: (*s_objet_argument_1).objet)).tableau)[j][i];
808: }
809:
810: l_element_courant = (*l_element_courant).suivant;
811: i++;
812: }
813: }
814: else // Matrice réelle
815: {
816: if ((*((struct_matrice *) (*s_objet_argument_1).objet))
817: .nombre_lignes != (*((struct_matrice *)
818: (*s_objet_argument_3).objet)).nombre_lignes)
819: {
820: if (variable_partagee == d_vrai)
821: {
822: if (pthread_mutex_unlock(&((*(*s_etat_processus)
823: .s_liste_variables_partagees).mutex)) != 0)
824: {
825: (*s_etat_processus).erreur_systeme = d_es_processus;
826: return;
827: }
828: }
829:
830: liberation(s_etat_processus, s_objet_argument_1);
831: liberation(s_etat_processus, s_objet_argument_2);
832:
833: if (presence_nom == d_faux)
834: {
835: liberation(s_etat_processus, s_objet_argument_3);
836: }
837:
838: (*s_etat_processus).erreur_execution =
839: d_ex_dimensions_invalides;
840: return;
841: }
842:
843: l_element_courant = (struct_liste_chainee *)
844: (*s_objet_argument_2).objet;
845: i = 0;
846:
847: while(l_element_courant != NULL)
848: {
849: position = (*((integer8 *) (*(*l_element_courant)
850: .donnee).objet));
851:
852: if ((position < 1) || (position > (integer8)
853: (*((struct_matrice *) (*s_objet_argument_3).objet))
854: .nombre_colonnes))
855: {
856: if (variable_partagee == d_vrai)
857: {
858: if (pthread_mutex_unlock(&((*(*s_etat_processus)
859: .s_liste_variables_partagees).mutex)) != 0)
860: {
861: (*s_etat_processus).erreur_systeme = d_es_processus;
862: return;
863: }
864: }
865:
866: liberation(s_etat_processus, s_objet_argument_1);
867: liberation(s_etat_processus, s_objet_argument_2);
868:
869: if (presence_nom == d_faux)
870: {
871: liberation(s_etat_processus, s_objet_argument_3);
872: }
873:
874: (*s_etat_processus).erreur_execution =
875: d_ex_argument_invalide;
876: return;
877: }
878:
879: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
880: .objet)).nombre_lignes; j++)
881: {
882: ((real8 **) (*((struct_matrice *) (*s_objet_argument_3)
883: .objet)).tableau)[j][position - 1] =
884: ((real8 **) (*((struct_matrice *)
885: (*s_objet_argument_1).objet)).tableau)[j][i];
886: }
887:
888: l_element_courant = (*l_element_courant).suivant;
889: i++;
890: }
891: }
892: }
893: else if ((*s_objet_argument_3).type == MCX)
894: {
895: if ((*s_objet_argument_1).type == MIN)
896: {
897: if ((*((struct_matrice *) (*s_objet_argument_1).objet))
898: .nombre_lignes != (*((struct_matrice *)
899: (*s_objet_argument_3).objet)).nombre_lignes)
900: {
901: if (variable_partagee == d_vrai)
902: {
903: if (pthread_mutex_unlock(&((*(*s_etat_processus)
904: .s_liste_variables_partagees).mutex)) != 0)
905: {
906: (*s_etat_processus).erreur_systeme = d_es_processus;
907: return;
908: }
909: }
910:
911: liberation(s_etat_processus, s_objet_argument_1);
912: liberation(s_etat_processus, s_objet_argument_2);
913:
914: if (presence_nom == d_faux)
915: {
916: liberation(s_etat_processus, s_objet_argument_3);
917: }
918:
919: (*s_etat_processus).erreur_execution =
920: d_ex_dimensions_invalides;
921: return;
922: }
923:
924: l_element_courant = (struct_liste_chainee *)
925: (*s_objet_argument_2).objet;
926: i = 0;
927:
928: while(l_element_courant != NULL)
929: {
930: position = (*((integer8 *) (*(*l_element_courant)
931: .donnee).objet));
932:
933: if ((position < 1) || (position > (integer8)
934: (*((struct_matrice *) (*s_objet_argument_3).objet))
935: .nombre_colonnes))
936: {
937: if (variable_partagee == d_vrai)
938: {
939: if (pthread_mutex_unlock(&((*(*s_etat_processus)
940: .s_liste_variables_partagees).mutex)) != 0)
941: {
942: (*s_etat_processus).erreur_systeme = d_es_processus;
943: return;
944: }
945: }
946:
947: liberation(s_etat_processus, s_objet_argument_1);
948: liberation(s_etat_processus, s_objet_argument_2);
949:
950: if (presence_nom == d_faux)
951: {
952: liberation(s_etat_processus, s_objet_argument_3);
953: }
954:
955: (*s_etat_processus).erreur_execution =
956: d_ex_argument_invalide;
957: return;
958: }
959:
960: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
961: .objet)).nombre_lignes; j++)
962: {
963: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
964: .objet)).tableau)[j][position - 1].partie_reelle =
965: (real8) ((integer8 **) (*((struct_matrice *)
966: (*s_objet_argument_1).objet)).tableau)[j][i];
967: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
968: .objet)).tableau)[j][position - 1]
969: .partie_imaginaire = 0;
970: }
971:
972: l_element_courant = (*l_element_courant).suivant;
973: i++;
974: }
975: }
976: else if ((*s_objet_argument_1).type == MRL)
977: {
978: if ((*((struct_matrice *) (*s_objet_argument_1).objet))
979: .nombre_lignes != (*((struct_matrice *)
980: (*s_objet_argument_3).objet)).nombre_lignes)
981: {
982: if (variable_partagee == d_vrai)
983: {
984: if (pthread_mutex_unlock(&((*(*s_etat_processus)
985: .s_liste_variables_partagees).mutex)) != 0)
986: {
987: (*s_etat_processus).erreur_systeme = d_es_processus;
988: return;
989: }
990: }
991:
992: liberation(s_etat_processus, s_objet_argument_1);
993: liberation(s_etat_processus, s_objet_argument_2);
994:
995: if (presence_nom == d_faux)
996: {
997: liberation(s_etat_processus, s_objet_argument_3);
998: }
999:
1000: (*s_etat_processus).erreur_execution =
1001: d_ex_dimensions_invalides;
1002: return;
1003: }
1004:
1005: l_element_courant = (struct_liste_chainee *)
1006: (*s_objet_argument_2).objet;
1007: i = 0;
1008:
1009: while(l_element_courant != NULL)
1010: {
1011: position = (*((integer8 *) (*(*l_element_courant)
1012: .donnee).objet));
1013:
1014: if ((position < 1) || (position > (integer8)
1015: (*((struct_matrice *) (*s_objet_argument_3).objet))
1016: .nombre_colonnes))
1017: {
1018: if (variable_partagee == d_vrai)
1019: {
1020: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1021: .s_liste_variables_partagees).mutex)) != 0)
1022: {
1023: (*s_etat_processus).erreur_systeme = d_es_processus;
1024: return;
1025: }
1026: }
1027:
1028: liberation(s_etat_processus, s_objet_argument_1);
1029: liberation(s_etat_processus, s_objet_argument_2);
1030:
1031: if (presence_nom == d_faux)
1032: {
1033: liberation(s_etat_processus, s_objet_argument_3);
1034: }
1035:
1036: (*s_etat_processus).erreur_execution =
1037: d_ex_argument_invalide;
1038: return;
1039: }
1040:
1041: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
1042: .objet)).nombre_lignes; j++)
1043: {
1044: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1045: .objet)).tableau)[j][position - 1].partie_reelle =
1046: ((real8 **) (*((struct_matrice *)
1047: (*s_objet_argument_1).objet)).tableau)[j][i];
1048: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1049: .objet)).tableau)[j][position - 1]
1050: .partie_imaginaire = 0;
1051: }
1052:
1053: l_element_courant = (*l_element_courant).suivant;
1054: i++;
1055: }
1056: }
1057: else // Matrice complexe
1058: {
1059: if ((*((struct_matrice *) (*s_objet_argument_1).objet))
1060: .nombre_lignes != (*((struct_matrice *)
1061: (*s_objet_argument_3).objet)).nombre_lignes)
1062: {
1063: if (variable_partagee == d_vrai)
1064: {
1065: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1066: .s_liste_variables_partagees).mutex)) != 0)
1067: {
1068: (*s_etat_processus).erreur_systeme = d_es_processus;
1069: return;
1070: }
1071: }
1072:
1073: liberation(s_etat_processus, s_objet_argument_1);
1074: liberation(s_etat_processus, s_objet_argument_2);
1075:
1076: if (presence_nom == d_faux)
1077: {
1078: liberation(s_etat_processus, s_objet_argument_3);
1079: }
1080:
1081: (*s_etat_processus).erreur_execution =
1082: d_ex_dimensions_invalides;
1083: return;
1084: }
1085:
1086: l_element_courant = (struct_liste_chainee *)
1087: (*s_objet_argument_2).objet;
1088: i = 0;
1089:
1090: while(l_element_courant != NULL)
1091: {
1092: position = (*((integer8 *) (*(*l_element_courant)
1093: .donnee).objet));
1094:
1095: if ((position < 1) || (position > (integer8)
1096: (*((struct_matrice *) (*s_objet_argument_3).objet))
1097: .nombre_colonnes))
1098: {
1099: if (variable_partagee == d_vrai)
1100: {
1101: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1102: .s_liste_variables_partagees).mutex)) != 0)
1103: {
1104: (*s_etat_processus).erreur_systeme = d_es_processus;
1105: return;
1106: }
1107: }
1108:
1109: liberation(s_etat_processus, s_objet_argument_1);
1110: liberation(s_etat_processus, s_objet_argument_2);
1111:
1112: if (presence_nom == d_faux)
1113: {
1114: liberation(s_etat_processus, s_objet_argument_3);
1115: }
1116:
1117: (*s_etat_processus).erreur_execution =
1118: d_ex_argument_invalide;
1119: return;
1120: }
1121:
1122: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
1123: .objet)).nombre_lignes; j++)
1124: {
1125: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1126: .objet)).tableau)[j][position - 1].partie_reelle =
1127: ((complex16 **) (*((struct_matrice *)
1128: (*s_objet_argument_1).objet)).tableau)[j][i]
1129: .partie_reelle;
1130: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1131: .objet)).tableau)[j][position - 1]
1132: .partie_imaginaire = ((complex16 **)
1133: (*((struct_matrice *) (*s_objet_argument_1).objet))
1134: .tableau)[j][i].partie_imaginaire;
1135: }
1136:
1137: l_element_courant = (*l_element_courant).suivant;
1138: i++;
1139: }
1140: }
1141: }
1142: else
1143: {
1144: if (variable_partagee == d_vrai)
1145: {
1146: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1147: .s_liste_variables_partagees).mutex)) != 0)
1148: {
1149: (*s_etat_processus).erreur_systeme = d_es_processus;
1150: return;
1151: }
1152: }
1153:
1154: liberation(s_etat_processus, s_objet_argument_1);
1155: liberation(s_etat_processus, s_objet_argument_2);
1156:
1157: if (presence_nom == d_faux)
1158: {
1159: liberation(s_etat_processus, s_objet_argument_3);
1160: }
1161:
1162: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1163: return;
1164: }
1165:
1166: if (presence_nom == d_faux)
1167: {
1168: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1169: s_objet_argument_3) == d_erreur)
1170: {
1171: return;
1172: }
1173: }
1174: else if (variable_partagee == d_vrai)
1175: {
1176: (*(*s_etat_processus).s_liste_variables_partagees).table
1177: [(*(*s_etat_processus).s_liste_variables_partagees)
1178: .position_variable].objet = s_objet_argument_3;
1179:
1180: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1181: .s_liste_variables_partagees).mutex)) != 0)
1182: {
1183: (*s_etat_processus).erreur_systeme = d_es_processus;
1184: return;
1185: }
1186: }
1187:
1188: liberation(s_etat_processus, s_objet_argument_1);
1189: liberation(s_etat_processus, s_objet_argument_2);
1190:
1191: return;
1192: }
1193:
1194:
1195: /*
1196: ================================================================================
1197: Fonction 'putr'
1198: ================================================================================
1199: Entrées :
1200: --------------------------------------------------------------------------------
1201: Sorties :
1202: --------------------------------------------------------------------------------
1203: Effets de bord : néant
1204: ================================================================================
1205: */
1206:
1207: void
1208: instruction_putr(struct_processus *s_etat_processus)
1209: {
1210: integer8 position;
1211:
1212: logical1 presence_nom;
1213: logical1 variable_partagee;
1214:
1215: struct_liste_chainee *l_element_courant;
1216:
1217: struct_objet *s_copie_argument_3;
1218: struct_objet *s_objet_argument_1;
1219: struct_objet *s_objet_argument_2;
1220: struct_objet *s_objet_argument_3;
1221:
1222: unsigned long i;
1223: unsigned long j;
1224: unsigned long nombre_elements;
1225:
1226: void *tampon;
1227:
1228: (*s_etat_processus).erreur_execution = d_ex;
1229:
1230: if ((*s_etat_processus).affichage_arguments == 'Y')
1231: {
1232: printf("\n PUTR ");
1233:
1234: if ((*s_etat_processus).langue == 'F')
1235: {
1236: printf("(change une ligne)\n\n");
1237: }
1238: else
1239: {
1240: printf("(change row)\n\n");
1241: }
1242:
1243: printf(" 3: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1244: printf(" 2: %s\n", d_LST);
1245: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1246: printf("-> 1: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
1247:
1248: printf(" 3: %s\n", d_NOM);
1249: printf(" 2: %s\n", d_LST);
1250: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1251:
1252: return;
1253: }
1254: else if ((*s_etat_processus).test_instruction == 'Y')
1255: {
1256: (*s_etat_processus).nombre_arguments = -1;
1257: return;
1258: }
1259:
1260: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1261: {
1262: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
1263: {
1264: return;
1265: }
1266: }
1267:
1268: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1269: &s_objet_argument_1) == d_erreur)
1270: {
1271: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1272: return;
1273: }
1274:
1275: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1276: &s_objet_argument_2) == d_erreur)
1277: {
1278: liberation(s_etat_processus, s_objet_argument_1);
1279:
1280: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1281: return;
1282: }
1283:
1284: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1285: &s_objet_argument_3) == d_erreur)
1286: {
1287: liberation(s_etat_processus, s_objet_argument_1);
1288: liberation(s_etat_processus, s_objet_argument_2);
1289:
1290: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1291: return;
1292: }
1293:
1294: if (((*s_objet_argument_1).type != MIN) &&
1295: ((*s_objet_argument_1).type != MRL) &&
1296: ((*s_objet_argument_1).type != MCX))
1297: {
1298: liberation(s_etat_processus, s_objet_argument_1);
1299: liberation(s_etat_processus, s_objet_argument_2);
1300: liberation(s_etat_processus, s_objet_argument_3);
1301:
1302: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1303: return;
1304: }
1305:
1306: if ((*s_objet_argument_2).type != LST)
1307: {
1308: liberation(s_etat_processus, s_objet_argument_1);
1309: liberation(s_etat_processus, s_objet_argument_2);
1310: liberation(s_etat_processus, s_objet_argument_3);
1311:
1312: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1313: return;
1314: }
1315:
1316: nombre_elements = 0;
1317: l_element_courant = (struct_liste_chainee *) (*s_objet_argument_2).objet;
1318:
1319: while(l_element_courant != NULL)
1320: {
1321: if ((*(*l_element_courant).donnee).type != INT)
1322: {
1323: liberation(s_etat_processus, s_objet_argument_1);
1324: liberation(s_etat_processus, s_objet_argument_2);
1325: liberation(s_etat_processus, s_objet_argument_3);
1326:
1327: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1328: return;
1329: }
1330:
1331: nombre_elements++;
1332: l_element_courant = (*l_element_courant).suivant;
1333: }
1334:
1335: if ((nombre_elements == 0) || (nombre_elements != (*((struct_matrice *)
1336: (*s_objet_argument_1).objet)).nombre_lignes))
1337: {
1338: liberation(s_etat_processus, s_objet_argument_1);
1339: liberation(s_etat_processus, s_objet_argument_2);
1340: liberation(s_etat_processus, s_objet_argument_3);
1341:
1342: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
1343: return;
1344: }
1345:
1346: variable_partagee = d_faux;
1347:
1348: if ((*s_objet_argument_3).type == NOM)
1349: {
1350: presence_nom = d_vrai;
1351:
1352: if (recherche_variable(s_etat_processus, (*((struct_nom *)
1353: (*s_objet_argument_3).objet)).nom) == d_faux)
1354: {
1355: (*s_etat_processus).erreur_systeme = d_es;
1356: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1357:
1358: liberation(s_etat_processus, s_objet_argument_1);
1359: liberation(s_etat_processus, s_objet_argument_2);
1360: liberation(s_etat_processus, s_objet_argument_3);
1361:
1362: return;
1363: }
1364:
1365: if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
1366: .position_variable_courante].variable_verrouillee == d_vrai)
1367: {
1368: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
1369:
1370: liberation(s_etat_processus, s_objet_argument_1);
1371: liberation(s_etat_processus, s_objet_argument_2);
1372: liberation(s_etat_processus, s_objet_argument_3);
1373:
1374: return;
1375: }
1376:
1377: liberation(s_etat_processus, s_objet_argument_3);
1378: s_objet_argument_3 = (*s_etat_processus).s_liste_variables
1379: [(*s_etat_processus).position_variable_courante].objet;
1380:
1381: if (s_objet_argument_3 == NULL)
1382: {
1383: if (pthread_mutex_lock(&((*(*s_etat_processus)
1384: .s_liste_variables_partagees).mutex)) != 0)
1385: {
1386: (*s_etat_processus).erreur_systeme = d_es_processus;
1387: return;
1388: }
1389:
1390: if (recherche_variable_partagee(s_etat_processus,
1391: (*s_etat_processus).s_liste_variables
1392: [(*s_etat_processus).position_variable_courante].nom,
1393: (*s_etat_processus).s_liste_variables
1394: [(*s_etat_processus).position_variable_courante]
1395: .variable_partagee, (*s_etat_processus).s_liste_variables
1396: [(*s_etat_processus).position_variable_courante].origine)
1397: == d_faux)
1398: {
1399: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1400: .s_liste_variables_partagees).mutex)) != 0)
1401: {
1402: (*s_etat_processus).erreur_systeme = d_es_processus;
1403: return;
1404: }
1405:
1406: (*s_etat_processus).erreur_systeme = d_es;
1407: (*s_etat_processus).erreur_execution =
1408: d_ex_variable_non_definie;
1409:
1410: liberation(s_etat_processus, s_objet_argument_1);
1411: liberation(s_etat_processus, s_objet_argument_2);
1412:
1413: return;
1414: }
1415:
1416: s_objet_argument_3 = (*(*s_etat_processus)
1417: .s_liste_variables_partagees).table[(*(*s_etat_processus)
1418: .s_liste_variables_partagees).position_variable].objet;
1419: variable_partagee = d_vrai;
1420: }
1421:
1422: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
1423: s_objet_argument_3, 'Q')) == NULL)
1424: {
1425: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1426: return;
1427: }
1428:
1429: liberation(s_etat_processus, s_objet_argument_3);
1430: s_objet_argument_3 = s_copie_argument_3;
1431:
1432: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
1433: .position_variable_courante].objet = s_objet_argument_3;
1434: }
1435: else
1436: {
1437: presence_nom = d_faux;
1438:
1439: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
1440: s_objet_argument_3, 'Q')) == NULL)
1441: {
1442: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1443: return;
1444: }
1445:
1446: liberation(s_etat_processus, s_objet_argument_3);
1447: s_objet_argument_3 = s_copie_argument_3;
1448: }
1449:
1450: if ((*s_objet_argument_1).type == MRL)
1451: {
1452: if ((*s_objet_argument_3).type == MIN)
1453: {
1454: // Conversion de la matrice entière en matrice réelle
1455:
1456: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
1457: .nombre_lignes; i++)
1458: {
1459: tampon = (*((struct_matrice *) (*s_objet_argument_3).objet))
1460: .tableau[i];
1461:
1462: if (((*((struct_matrice *) (*s_objet_argument_3).objet))
1463: .tableau[i] = malloc((*((struct_matrice *)
1464: (*s_objet_argument_3).objet)).nombre_colonnes *
1465: sizeof(real8))) == NULL)
1466: {
1467: if (variable_partagee == d_vrai)
1468: {
1469: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1470: .s_liste_variables_partagees).mutex)) != 0)
1471: {
1472: (*s_etat_processus).erreur_systeme = d_es_processus;
1473: return;
1474: }
1475: }
1476:
1477: (*s_etat_processus).erreur_systeme =
1478: d_es_allocation_memoire;
1479: return;
1480: }
1481:
1482: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
1483: .objet)).nombre_colonnes; j++)
1484: {
1485: ((real8 **) (*((struct_matrice *) (*s_objet_argument_3)
1486: .objet)).tableau)[i][j] = (real8) (((integer8 *)
1487: tampon)[j]);
1488: }
1489:
1490: free(tampon);
1491: }
1492:
1493: (*((struct_matrice *) (*s_objet_argument_3).objet)).type = 'R';
1494: (*s_objet_argument_3).type = MRL;
1495: }
1496: }
1497: else if ((*s_objet_argument_1).type == MCX)
1498: {
1499: if ((*s_objet_argument_3).type == MIN)
1500: {
1501: // Conversion de la matrice entière en matrice complexe
1502:
1503: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
1504: .nombre_lignes; i++)
1505: {
1506: tampon = (*((struct_matrice *) (*s_objet_argument_3).objet))
1507: .tableau[i];
1508:
1509: if (((*((struct_matrice *) (*s_objet_argument_3).objet))
1510: .tableau[i] = malloc((*((struct_matrice *)
1511: (*s_objet_argument_3).objet)).nombre_colonnes *
1512: sizeof(complex16))) == NULL)
1513: {
1514: if (variable_partagee == d_vrai)
1515: {
1516: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1517: .s_liste_variables_partagees).mutex)) != 0)
1518: {
1519: (*s_etat_processus).erreur_systeme = d_es_processus;
1520: return;
1521: }
1522: }
1523:
1524: (*s_etat_processus).erreur_systeme =
1525: d_es_allocation_memoire;
1526: return;
1527: }
1528:
1529: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
1530: .objet)).nombre_colonnes; j++)
1531: {
1532: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1533: .objet)).tableau)[i][j].partie_reelle =
1534: (real8) (((integer8 *) tampon)[j]);
1535: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1536: .objet)).tableau)[i][j].partie_imaginaire = 0;
1537: }
1538:
1539: free(tampon);
1540: }
1541:
1542: (*((struct_matrice *) (*s_objet_argument_3).objet)).type = 'C';
1543: (*s_objet_argument_3).type = MCX;
1544: }
1545: else if ((*s_objet_argument_3).type == MRL)
1546: {
1547: // Conversion de la matrice réelle en matrice complexe
1548:
1549: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
1550: .nombre_lignes; i++)
1551: {
1552: tampon = (*((struct_matrice *) (*s_objet_argument_3).objet))
1553: .tableau[i];
1554:
1555: if (((*((struct_matrice *) (*s_objet_argument_3).objet))
1556: .tableau[i] = malloc((*((struct_matrice *)
1557: (*s_objet_argument_3).objet)).nombre_colonnes *
1558: sizeof(complex16))) == NULL)
1559: {
1560: if (variable_partagee == d_vrai)
1561: {
1562: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1563: .s_liste_variables_partagees).mutex)) != 0)
1564: {
1565: (*s_etat_processus).erreur_systeme = d_es_processus;
1566: return;
1567: }
1568: }
1569:
1570: (*s_etat_processus).erreur_systeme =
1571: d_es_allocation_memoire;
1572: return;
1573: }
1574:
1575: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
1576: .objet)).nombre_colonnes; j++)
1577: {
1578: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1579: .objet)).tableau)[i][j].partie_reelle =
1580: ((real8 *) tampon)[j];
1581: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1582: .objet)).tableau)[i][j].partie_imaginaire = 0;
1583: }
1584:
1585: free(tampon);
1586: }
1587:
1588: (*((struct_matrice *) (*s_objet_argument_3).objet)).type = 'C';
1589: (*s_objet_argument_3).type = MCX;
1590: }
1591: }
1592:
1593: if ((*s_objet_argument_3).type == MIN)
1594: {
1595: if ((*((struct_matrice *) (*s_objet_argument_1).objet)).nombre_colonnes
1596: != (*((struct_matrice *) (*s_objet_argument_3).objet))
1597: .nombre_colonnes)
1598: {
1599: if (variable_partagee == d_vrai)
1600: {
1601: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1602: .s_liste_variables_partagees).mutex)) != 0)
1603: {
1604: (*s_etat_processus).erreur_systeme = d_es_processus;
1605: return;
1606: }
1607: }
1608:
1609: liberation(s_etat_processus, s_objet_argument_1);
1610: liberation(s_etat_processus, s_objet_argument_2);
1611:
1612: if (presence_nom == d_faux)
1613: {
1614: liberation(s_etat_processus, s_objet_argument_3);
1615: }
1616:
1617: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
1618: return;
1619: }
1620:
1621: l_element_courant = (struct_liste_chainee *)
1622: (*s_objet_argument_2).objet;
1623: i = 0;
1624:
1625: while(l_element_courant != NULL)
1626: {
1627: position = (*((integer8 *) (*(*l_element_courant).donnee).objet));
1628:
1629: if ((position < 1) || (position > (integer8) (*((struct_matrice *)
1630: (*s_objet_argument_3).objet)).nombre_lignes))
1631: {
1632: if (variable_partagee == d_vrai)
1633: {
1634: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1635: .s_liste_variables_partagees).mutex)) != 0)
1636: {
1637: (*s_etat_processus).erreur_systeme = d_es_processus;
1638: return;
1639: }
1640: }
1641:
1642: liberation(s_etat_processus, s_objet_argument_1);
1643: liberation(s_etat_processus, s_objet_argument_2);
1644:
1645: if (presence_nom == d_faux)
1646: {
1647: liberation(s_etat_processus, s_objet_argument_3);
1648: }
1649:
1650: (*s_etat_processus).erreur_execution =
1651: d_ex_argument_invalide;
1652: return;
1653: }
1654:
1655: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3).objet))
1656: .nombre_colonnes; j++)
1657: {
1658: ((integer8 **) (*((struct_matrice *) (*s_objet_argument_3)
1659: .objet)).tableau)[position - 1][j] = ((integer8 **)
1660: (*((struct_matrice *) (*s_objet_argument_1).objet))
1661: .tableau)[i][j];
1662: }
1663:
1664: l_element_courant = (*l_element_courant).suivant;
1665: i++;
1666: }
1667: }
1668: else if ((*s_objet_argument_3).type == MRL)
1669: {
1670: if ((*s_objet_argument_1).type == MIN)
1671: {
1672: if ((*((struct_matrice *) (*s_objet_argument_1).objet))
1673: .nombre_colonnes != (*((struct_matrice *)
1674: (*s_objet_argument_3).objet)).nombre_colonnes)
1675: {
1676: if (variable_partagee == d_vrai)
1677: {
1678: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1679: .s_liste_variables_partagees).mutex)) != 0)
1680: {
1681: (*s_etat_processus).erreur_systeme = d_es_processus;
1682: return;
1683: }
1684: }
1685:
1686: liberation(s_etat_processus, s_objet_argument_1);
1687: liberation(s_etat_processus, s_objet_argument_2);
1688:
1689: if (presence_nom == d_faux)
1690: {
1691: liberation(s_etat_processus, s_objet_argument_3);
1692: }
1693:
1694: (*s_etat_processus).erreur_execution =
1695: d_ex_dimensions_invalides;
1696: return;
1697: }
1698:
1699: l_element_courant = (struct_liste_chainee *)
1700: (*s_objet_argument_2).objet;
1701: i = 0;
1702:
1703: while(l_element_courant != NULL)
1704: {
1705: position = (*((integer8 *) (*(*l_element_courant)
1706: .donnee).objet));
1707:
1708: if ((position < 1) || (position > (integer8)
1709: (*((struct_matrice *) (*s_objet_argument_3).objet))
1710: .nombre_lignes))
1711: {
1712: if (variable_partagee == d_vrai)
1713: {
1714: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1715: .s_liste_variables_partagees).mutex)) != 0)
1716: {
1717: (*s_etat_processus).erreur_systeme = d_es_processus;
1718: return;
1719: }
1720: }
1721:
1722: liberation(s_etat_processus, s_objet_argument_1);
1723: liberation(s_etat_processus, s_objet_argument_2);
1724:
1725: if (presence_nom == d_faux)
1726: {
1727: liberation(s_etat_processus, s_objet_argument_3);
1728: }
1729:
1730: (*s_etat_processus).erreur_execution =
1731: d_ex_argument_invalide;
1732: return;
1733: }
1734:
1735: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
1736: .objet)).nombre_colonnes; j++)
1737: {
1738: ((real8 **) (*((struct_matrice *) (*s_objet_argument_3)
1739: .objet)).tableau)[position - 1][j] = (real8)
1740: ((integer8 **) (*((struct_matrice *)
1741: (*s_objet_argument_1).objet)).tableau)[i][j];
1742: }
1743:
1744: l_element_courant = (*l_element_courant).suivant;
1745: i++;
1746: }
1747: }
1748: else // Matrice réelle
1749: {
1750: if ((*((struct_matrice *) (*s_objet_argument_1).objet))
1751: .nombre_colonnes != (*((struct_matrice *)
1752: (*s_objet_argument_3).objet)).nombre_colonnes)
1753: {
1754: if (variable_partagee == d_vrai)
1755: {
1756: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1757: .s_liste_variables_partagees).mutex)) != 0)
1758: {
1759: (*s_etat_processus).erreur_systeme = d_es_processus;
1760: return;
1761: }
1762: }
1763:
1764: liberation(s_etat_processus, s_objet_argument_1);
1765: liberation(s_etat_processus, s_objet_argument_2);
1766:
1767: if (presence_nom == d_faux)
1768: {
1769: liberation(s_etat_processus, s_objet_argument_3);
1770: }
1771:
1772: (*s_etat_processus).erreur_execution =
1773: d_ex_dimensions_invalides;
1774: return;
1775: }
1776:
1777: l_element_courant = (struct_liste_chainee *)
1778: (*s_objet_argument_2).objet;
1779: i = 0;
1780:
1781: while(l_element_courant != NULL)
1782: {
1783: position = (*((integer8 *) (*(*l_element_courant)
1784: .donnee).objet));
1785:
1786: if ((position < 1) || (position > (integer8)
1787: (*((struct_matrice *) (*s_objet_argument_3).objet))
1788: .nombre_lignes))
1789: {
1790: if (variable_partagee == d_vrai)
1791: {
1792: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1793: .s_liste_variables_partagees).mutex)) != 0)
1794: {
1795: (*s_etat_processus).erreur_systeme = d_es_processus;
1796: return;
1797: }
1798: }
1799:
1800: liberation(s_etat_processus, s_objet_argument_1);
1801: liberation(s_etat_processus, s_objet_argument_2);
1802:
1803: if (presence_nom == d_faux)
1804: {
1805: liberation(s_etat_processus, s_objet_argument_3);
1806: }
1807:
1808: (*s_etat_processus).erreur_execution =
1809: d_ex_argument_invalide;
1810: return;
1811: }
1812:
1813: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
1814: .objet)).nombre_colonnes; j++)
1815: {
1816: ((real8 **) (*((struct_matrice *) (*s_objet_argument_3)
1817: .objet)).tableau)[position - 1][j] =
1818: ((real8 **) (*((struct_matrice *)
1819: (*s_objet_argument_1).objet)).tableau)[i][j];
1820: }
1821:
1822: l_element_courant = (*l_element_courant).suivant;
1823: i++;
1824: }
1825: }
1826: }
1827: else if ((*s_objet_argument_3).type == MCX)
1828: {
1829: if ((*s_objet_argument_1).type == MIN)
1830: {
1831: if ((*((struct_matrice *) (*s_objet_argument_1).objet))
1832: .nombre_colonnes != (*((struct_matrice *)
1833: (*s_objet_argument_3).objet)).nombre_colonnes)
1834: {
1835: if (variable_partagee == d_vrai)
1836: {
1837: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1838: .s_liste_variables_partagees).mutex)) != 0)
1839: {
1840: (*s_etat_processus).erreur_systeme = d_es_processus;
1841: return;
1842: }
1843: }
1844:
1845: liberation(s_etat_processus, s_objet_argument_1);
1846: liberation(s_etat_processus, s_objet_argument_2);
1847:
1848: if (presence_nom == d_faux)
1849: {
1850: liberation(s_etat_processus, s_objet_argument_3);
1851: }
1852:
1853: (*s_etat_processus).erreur_execution =
1854: d_ex_dimensions_invalides;
1855: return;
1856: }
1857:
1858: l_element_courant = (struct_liste_chainee *)
1859: (*s_objet_argument_2).objet;
1860: i = 0;
1861:
1862: while(l_element_courant != NULL)
1863: {
1864: position = (*((integer8 *) (*(*l_element_courant)
1865: .donnee).objet));
1866:
1867: if ((position < 1) || (position > (integer8)
1868: (*((struct_matrice *) (*s_objet_argument_3).objet))
1869: .nombre_lignes))
1870: {
1871: if (variable_partagee == d_vrai)
1872: {
1873: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1874: .s_liste_variables_partagees).mutex)) != 0)
1875: {
1876: (*s_etat_processus).erreur_systeme = d_es_processus;
1877: return;
1878: }
1879: }
1880:
1881: liberation(s_etat_processus, s_objet_argument_1);
1882: liberation(s_etat_processus, s_objet_argument_2);
1883:
1884: if (presence_nom == d_faux)
1885: {
1886: liberation(s_etat_processus, s_objet_argument_3);
1887: }
1888:
1889: (*s_etat_processus).erreur_execution =
1890: d_ex_argument_invalide;
1891: return;
1892: }
1893:
1894: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
1895: .objet)).nombre_colonnes; j++)
1896: {
1897: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1898: .objet)).tableau)[position - 1][j].partie_reelle =
1899: (real8) ((integer8 **) (*((struct_matrice *)
1900: (*s_objet_argument_1).objet)).tableau)[i][j];
1901: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1902: .objet)).tableau)[position - 1][j]
1903: .partie_imaginaire = 0;
1904: }
1905:
1906: l_element_courant = (*l_element_courant).suivant;
1907: i++;
1908: }
1909: }
1910: else if ((*s_objet_argument_1).type == MRL)
1911: {
1912: if ((*((struct_matrice *) (*s_objet_argument_1).objet))
1913: .nombre_colonnes != (*((struct_matrice *)
1914: (*s_objet_argument_3).objet)).nombre_colonnes)
1915: {
1916: if (variable_partagee == d_vrai)
1917: {
1918: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1919: .s_liste_variables_partagees).mutex)) != 0)
1920: {
1921: (*s_etat_processus).erreur_systeme = d_es_processus;
1922: return;
1923: }
1924: }
1925:
1926: liberation(s_etat_processus, s_objet_argument_1);
1927: liberation(s_etat_processus, s_objet_argument_2);
1928:
1929: if (presence_nom == d_faux)
1930: {
1931: liberation(s_etat_processus, s_objet_argument_3);
1932: }
1933:
1934: (*s_etat_processus).erreur_execution =
1935: d_ex_dimensions_invalides;
1936: return;
1937: }
1938:
1939: l_element_courant = (struct_liste_chainee *)
1940: (*s_objet_argument_2).objet;
1941: i = 0;
1942:
1943: while(l_element_courant != NULL)
1944: {
1945: position = (*((integer8 *) (*(*l_element_courant)
1946: .donnee).objet));
1947:
1948: if ((position < 1) || (position > (integer8)
1949: (*((struct_matrice *) (*s_objet_argument_3).objet))
1950: .nombre_lignes))
1951: {
1952: if (variable_partagee == d_vrai)
1953: {
1954: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1955: .s_liste_variables_partagees).mutex)) != 0)
1956: {
1957: (*s_etat_processus).erreur_systeme = d_es_processus;
1958: return;
1959: }
1960: }
1961:
1962: liberation(s_etat_processus, s_objet_argument_1);
1963: liberation(s_etat_processus, s_objet_argument_2);
1964:
1965: if (presence_nom == d_faux)
1966: {
1967: liberation(s_etat_processus, s_objet_argument_3);
1968: }
1969:
1970: (*s_etat_processus).erreur_execution =
1971: d_ex_argument_invalide;
1972: return;
1973: }
1974:
1975: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
1976: .objet)).nombre_colonnes; j++)
1977: {
1978: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1979: .objet)).tableau)[position - 1][j].partie_reelle =
1980: ((real8 **) (*((struct_matrice *)
1981: (*s_objet_argument_1).objet)).tableau)[i][j];
1982: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
1983: .objet)).tableau)[position - 1][j]
1984: .partie_imaginaire = 0;
1985: }
1986:
1987: l_element_courant = (*l_element_courant).suivant;
1988: i++;
1989: }
1990: }
1991: else // Matrice complexe
1992: {
1993: if ((*((struct_matrice *) (*s_objet_argument_1).objet))
1994: .nombre_colonnes != (*((struct_matrice *)
1995: (*s_objet_argument_3).objet)).nombre_colonnes)
1996: {
1997: if (variable_partagee == d_vrai)
1998: {
1999: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2000: .s_liste_variables_partagees).mutex)) != 0)
2001: {
2002: (*s_etat_processus).erreur_systeme = d_es_processus;
2003: return;
2004: }
2005: }
2006:
2007: liberation(s_etat_processus, s_objet_argument_1);
2008: liberation(s_etat_processus, s_objet_argument_2);
2009:
2010: if (presence_nom == d_faux)
2011: {
2012: liberation(s_etat_processus, s_objet_argument_3);
2013: }
2014:
2015: (*s_etat_processus).erreur_execution =
2016: d_ex_dimensions_invalides;
2017: return;
2018: }
2019:
2020: l_element_courant = (struct_liste_chainee *)
2021: (*s_objet_argument_2).objet;
2022: i = 0;
2023:
2024: while(l_element_courant != NULL)
2025: {
2026: position = (*((integer8 *) (*(*l_element_courant)
2027: .donnee).objet));
2028:
2029: if ((position < 1) || (position > (integer8)
2030: (*((struct_matrice *) (*s_objet_argument_3).objet))
2031: .nombre_lignes))
2032: {
2033: if (variable_partagee == d_vrai)
2034: {
2035: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2036: .s_liste_variables_partagees).mutex)) != 0)
2037: {
2038: (*s_etat_processus).erreur_systeme = d_es_processus;
2039: return;
2040: }
2041: }
2042:
2043: liberation(s_etat_processus, s_objet_argument_1);
2044: liberation(s_etat_processus, s_objet_argument_2);
2045:
2046: if (presence_nom == d_faux)
2047: {
2048: liberation(s_etat_processus, s_objet_argument_3);
2049: }
2050:
2051: (*s_etat_processus).erreur_execution =
2052: d_ex_argument_invalide;
2053: return;
2054: }
2055:
2056: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
2057: .objet)).nombre_colonnes; j++)
2058: {
2059: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
2060: .objet)).tableau)[position - 1][j].partie_reelle =
2061: ((complex16 **) (*((struct_matrice *)
2062: (*s_objet_argument_1).objet)).tableau)[i][j]
2063: .partie_reelle;
2064: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
2065: .objet)).tableau)[position - 1][j]
2066: .partie_imaginaire = ((complex16 **)
2067: (*((struct_matrice *) (*s_objet_argument_1).objet))
2068: .tableau)[i][j].partie_imaginaire;
2069: }
2070:
2071: l_element_courant = (*l_element_courant).suivant;
2072: i++;
2073: }
2074: }
2075: }
2076: else
2077: {
2078: if (variable_partagee == d_vrai)
2079: {
2080: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2081: .s_liste_variables_partagees).mutex)) != 0)
2082: {
2083: (*s_etat_processus).erreur_systeme = d_es_processus;
2084: return;
2085: }
2086: }
2087:
2088: liberation(s_etat_processus, s_objet_argument_1);
2089: liberation(s_etat_processus, s_objet_argument_2);
2090:
2091: if (presence_nom == d_faux)
2092: {
2093: liberation(s_etat_processus, s_objet_argument_3);
2094: }
2095:
2096: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2097: return;
2098: }
2099:
2100: if (presence_nom == d_faux)
2101: {
2102: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2103: s_objet_argument_3) == d_erreur)
2104: {
2105: return;
2106: }
2107: }
2108: else if (variable_partagee == d_vrai)
2109: {
2110: (*(*s_etat_processus).s_liste_variables_partagees).table
2111: [(*(*s_etat_processus).s_liste_variables_partagees)
2112: .position_variable].objet = s_objet_argument_3;
2113:
2114: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2115: .s_liste_variables_partagees).mutex)) != 0)
2116: {
2117: (*s_etat_processus).erreur_systeme = d_es_processus;
2118: return;
2119: }
2120: }
2121:
2122: liberation(s_etat_processus, s_objet_argument_1);
2123: liberation(s_etat_processus, s_objet_argument_2);
2124:
2125: return;
2126: }
2127:
2128: // vim: ts=4