![]() ![]() | ![]() |
1.1 bertrand 1: /*
2: ================================================================================
1.4 ! bertrand 3: RPL/2 (R) version 4.0.12
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 's+'
29: ================================================================================
30: Entrées : structure processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_s_plus(struct_processus *s_etat_processus)
40: {
41: long i;
42:
43: logical1 creation_variable_sigma;
44: logical1 presence_variable;
45:
46: struct_objet *s_copie;
47: struct_objet *s_copie_statistique;
48: struct_objet *s_objet;
49: struct_objet *s_objet_statistique;
50:
51: struct_variable s_variable;
52:
53: unsigned long j;
54: unsigned long k;
55: unsigned long nombre_colonnes;
56: unsigned long nombre_lignes;
57:
58: void *tampon;
59:
60: (*s_etat_processus).erreur_execution = d_ex;
61:
62: if ((*s_etat_processus).affichage_arguments == 'Y')
63: {
64: printf("\n S+ ");
65:
66: if ((*s_etat_processus).langue == 'F')
67: {
68: printf("(ajout d'une donnée dans la matrice statistique)\n\n");
69: }
70: else
71: {
72: printf("(add a data value in statistical matrix)\n\n");
73: }
74:
75: printf(" 1: %s, %s, %s, %s, %s, %s\n", d_INT, d_REL, d_VIN, d_VRL,
76: d_MIN, d_MRL);
77:
78: return;
79: }
80: else if ((*s_etat_processus).test_instruction == 'Y')
81: {
82: (*s_etat_processus).nombre_arguments = -1;
83: return;
84: }
85:
86: if (test_cfsf(s_etat_processus, 31) == d_vrai)
87: {
88: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
89: {
90: return;
91: }
92: }
93:
94: /*
95: * Recherche d'une variable globale référencée par SIGMA
96: */
97:
98: if (recherche_variable(s_etat_processus, ds_sdat) == d_faux)
99: {
100: /*
101: * Aucune variable SIGMA, donc il faut la créer en fonction
102: * de l'objet à introduire.
103: */
104:
105: (*s_etat_processus).erreur_systeme = d_es;
106: creation_variable_sigma = d_vrai;
107: nombre_colonnes = 0;
108: }
109: else
110: {
111: /*
112: * Il existe une variable locale SIGMA. Reste à vérifier l'existence
113: * d'une variable SIGMA globale...
114: */
115:
116: i = (*s_etat_processus).position_variable_courante;
117: presence_variable = d_faux;
118:
119: while(i >= 0)
120: {
121: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
122: ds_sdat) == 0) && ((*s_etat_processus)
123: .s_liste_variables[i].niveau == 1))
124: {
125: presence_variable = d_vrai;
126: break;
127: }
128:
129: i--;
130: }
131:
132: if (presence_variable == d_faux)
133: {
134: creation_variable_sigma = d_vrai;
135: nombre_colonnes = 0;
136: }
137: else
138: {
139: creation_variable_sigma = d_faux;
140:
141: (*s_etat_processus).position_variable_courante = i;
142:
143: if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
144: .position_variable_courante].variable_verrouillee ==
145: d_vrai)
146: {
147: (*s_etat_processus).erreur_execution =
148: d_ex_variable_verrouillee;
149: return;
150: }
151:
152: if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
153: {
154: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
155: return;
156: }
157:
158: if (((*((*s_etat_processus).s_liste_variables
159: [(*s_etat_processus).position_variable_courante].objet))
160: .type != MIN) && ((*((*s_etat_processus)
161: .s_liste_variables[(*s_etat_processus)
162: .position_variable_courante].objet)).type != MRL))
163: {
164: (*s_etat_processus).erreur_execution =
165: d_ex_matrice_statistique_invalide;
166: return;
167: }
168:
169: if ((s_copie_statistique = copie_objet(s_etat_processus,
170: (*s_etat_processus)
171: .s_liste_variables[(*s_etat_processus)
172: .position_variable_courante].objet, 'Q')) == NULL)
173: {
174: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
175: return;
176: }
177:
178: liberation(s_etat_processus, (*s_etat_processus).s_liste_variables
179: [(*s_etat_processus).position_variable_courante].objet);
180: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
181: .position_variable_courante].objet = s_copie_statistique;
182:
183: nombre_colonnes = (*((struct_matrice *) (*((*s_etat_processus)
184: .s_liste_variables[(*s_etat_processus)
185: .position_variable_courante].objet)).objet))
186: .nombre_colonnes;
187: }
188: }
189:
190: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
191: &s_objet) == d_erreur)
192: {
193: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
194: return;
195: }
196:
197: if ((s_copie = copie_objet(s_etat_processus, s_objet, 'O')) == NULL)
198: {
199: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
200: return;
201: }
202:
203: liberation(s_etat_processus, s_objet);
204: s_objet = s_copie;
205:
206: /*
207: * Ajout d'un scalaire
208: */
209:
210: if (((*s_objet).type == INT) ||
211: ((*s_objet).type == REL))
212: {
213: if (creation_variable_sigma == d_vrai)
214: {
215: /*
216: * Création d'une matrice statistique 1*1
217: */
218:
219: if ((s_variable.nom = malloc(6 * sizeof(unsigned char))) == NULL)
220: {
221: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
222: return;
223: }
224:
225: strcpy(s_variable.nom, ds_sdat);
226: s_variable.niveau = 1;
227:
228: if ((*s_objet).type == INT)
229: {
230: if ((s_objet_statistique = allocation(s_etat_processus, MIN))
231: == NULL)
232: {
233: (*s_etat_processus).erreur_systeme =
234: d_es_allocation_memoire;
235: return;
236: }
237:
238: if (((*((struct_matrice *) (*s_objet_statistique).objet))
239: .tableau = malloc(sizeof(integer8 *))) == NULL)
240: {
241: (*s_etat_processus).erreur_systeme =
242: d_es_allocation_memoire;
243: return;
244: }
245:
246: ((integer8 **) (*((struct_matrice *) (*s_objet_statistique)
247: .objet)).tableau)[0] = (integer8 *) (*s_objet).objet;
248: }
249: else
250: {
251: if ((s_objet_statistique = allocation(s_etat_processus, MRL))
252: == NULL)
253: {
254: (*s_etat_processus).erreur_systeme =
255: d_es_allocation_memoire;
256: return;
257: }
258:
259: if (((*((struct_matrice *) (*s_objet_statistique).objet))
260: .tableau = malloc(sizeof(real8 *))) == NULL)
261: {
262: (*s_etat_processus).erreur_systeme =
263: d_es_allocation_memoire;
264: return;
265: }
266:
267: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
268: .objet)).tableau)[0] = (real8 *) (*s_objet).objet;
269: }
270:
271: (*((struct_matrice *) (*s_objet_statistique).objet))
272: .nombre_colonnes = 1;
273: (*((struct_matrice *) (*s_objet_statistique).objet))
274: .nombre_lignes = 1;
275:
276: free(s_objet);
277: s_objet = NULL;
278:
279: s_variable.objet = s_objet_statistique;
280:
281: if (creation_variable(s_etat_processus, &s_variable, 'V', 'P')
282: == d_erreur)
283: {
284: return;
285: }
286: }
287: else
288: {
289: /*
290: * La variable existe déjà, il faut lui rajouter une ligne.
291: */
292:
293: if (nombre_colonnes != 1)
294: {
295: (*s_etat_processus).erreur_execution =
296: d_ex_dimensions_matrice_statistique;
297:
298: liberation(s_etat_processus, s_objet);
299: return;
300: }
301:
302: s_objet_statistique = ((*s_etat_processus).s_liste_variables
303: [(*s_etat_processus).position_variable_courante]).objet;
304:
305: if (((*s_objet_statistique).type == MIN) &&
306: ((*s_objet).type == INT))
307: {
308: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
309: .tableau;
310: (*((struct_matrice *) (*s_objet_statistique).objet))
311: .nombre_lignes++;
312:
313: if (((*((struct_matrice *) (*s_objet_statistique).objet))
314: .tableau = malloc((*((struct_matrice *)
315: (*s_objet_statistique).objet)).nombre_lignes *
316: sizeof(integer8 *))) == NULL)
317: {
318: (*s_etat_processus).erreur_systeme =
319: d_es_allocation_memoire;
320: return;
321: }
322:
323: for(i = 0; i < (long) ((*((struct_matrice *)
324: (*s_objet_statistique).objet)).nombre_lignes - 1); i++)
325: {
326: ((integer8 **) (*((struct_matrice *) (*s_objet_statistique)
327: .objet)).tableau)[i] = ((integer8 **) tampon)[i];
328: }
329:
330: free(tampon);
331:
332: ((integer8 **) (*((struct_matrice *) (*s_objet_statistique)
333: .objet)).tableau)[i] = (integer8 *) (*s_objet).objet;
334:
335: free(s_objet);
336: s_objet = NULL;
337: }
338: else if (((*s_objet_statistique).type == MRL) &&
339: ((*s_objet).type == REL))
340: {
341: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
342: .tableau;
343: (*((struct_matrice *) (*s_objet_statistique).objet))
344: .nombre_lignes++;
345:
346: if (((*((struct_matrice *) (*s_objet_statistique).objet))
347: .tableau = malloc((*((struct_matrice *)
348: (*s_objet_statistique).objet)).nombre_lignes *
349: sizeof(real8 *))) == NULL)
350: {
351: (*s_etat_processus).erreur_systeme =
352: d_es_allocation_memoire;
353: return;
354: }
355:
356: for(i = 0; i < (long) ((*((struct_matrice *)
357: (*s_objet_statistique).objet)).nombre_lignes - 1); i++)
358: {
359: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
360: .objet)).tableau)[i] = ((real8 **) tampon)[i];
361: }
362:
363: free(tampon);
364:
365: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
366: .objet)).tableau)[i] = (real8 *) (*s_objet).objet;
367:
368: free(s_objet);
369: s_objet = NULL;
370: }
371: else if (((*s_objet_statistique).type == MRL) &&
372: ((*s_objet).type == INT))
373: {
374: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
375: .tableau;
376: (*((struct_matrice *) (*s_objet_statistique).objet))
377: .nombre_lignes++;
378:
379: if (((*((struct_matrice *) (*s_objet_statistique).objet))
380: .tableau = malloc((*((struct_matrice *)
381: (*s_objet_statistique).objet)).nombre_lignes *
382: sizeof(real8 *))) == NULL)
383: {
384: (*s_etat_processus).erreur_systeme =
385: d_es_allocation_memoire;
386: return;
387: }
388:
389: for(i = 0; i < (long) ((*((struct_matrice *)
390: (*s_objet_statistique).objet)).nombre_lignes - 1); i++)
391: {
392: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
393: .objet)).tableau)[i] = ((real8 **) tampon)[i];
394: }
395:
396: free(tampon);
397:
398: if ((((real8 **) (*((struct_matrice *) (*s_objet_statistique)
399: .objet)).tableau)[i] = malloc(sizeof(real8)))
400: == NULL)
401: {
402: (*s_etat_processus).erreur_systeme =
403: d_es_allocation_memoire;
404: return;
405: }
406:
407: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
408: .objet)).tableau)[i][0] =
409: (real8) (*((integer8 *) (*s_objet).objet));
410: }
411: else
412: {
413: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
414: .tableau;
415: (*((struct_matrice *) (*s_objet_statistique).objet))
416: .nombre_lignes++;
417:
418: if (((*((struct_matrice *) (*s_objet_statistique).objet))
419: .tableau = malloc((*((struct_matrice *)
420: (*s_objet_statistique).objet)).nombre_lignes *
421: sizeof(real8 *))) == NULL)
422: {
423: (*s_etat_processus).erreur_systeme =
424: d_es_allocation_memoire;
425: return;
426: }
427:
428: for(i = 0; i < (long) ((*((struct_matrice *)
429: (*s_objet_statistique).objet)).nombre_lignes - 1); i++)
430: {
431: if ((((real8 **) (*((struct_matrice *)
432: (*s_objet_statistique).objet)).tableau)[i] =
433: malloc(sizeof(real8))) == NULL)
434: {
435: (*s_etat_processus).erreur_systeme =
436: d_es_allocation_memoire;
437: return;
438: }
439:
440: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
441: .objet)).tableau)[i][0] = (real8)
442: ((integer8 **) tampon)[i][0];
443:
444: free(((integer8 **) tampon)[i]);
445: }
446:
447: if ((((real8 **) (*((struct_matrice *) (*s_objet_statistique)
448: .objet)).tableau)[i] = malloc(sizeof(real8)))
449: == NULL)
450: {
451: (*s_etat_processus).erreur_systeme =
452: d_es_allocation_memoire;
453: return;
454: }
455:
456: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
457: .objet)).tableau)[i][0] = (*((real8 *)
458: (*s_objet).objet));
459:
460: (*((struct_matrice *) (*s_objet_statistique).objet)).type = 'R';
461: (*s_objet_statistique).type = MRL;
462:
463: free(tampon);
464: }
465: }
466: }
467:
468: /*
469: * Ajout d'un vecteur
470: */
471:
472: else if (((*s_objet).type == VIN) ||
473: ((*s_objet).type == VRL))
474: {
475: if (creation_variable_sigma == d_vrai)
476: {
477: /*
478: * Création d'une matrice statistique 1*NC
479: */
480:
481: if ((s_variable.nom = malloc(6 * sizeof(unsigned char))) == NULL)
482: {
483: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
484: return;
485: }
486:
487: strcpy(s_variable.nom, ds_sdat);
488: s_variable.niveau = 1;
489:
490: if ((*s_objet).type == VIN)
491: {
492: if ((s_objet_statistique = allocation(s_etat_processus, MIN))
493: == NULL)
494: {
495: (*s_etat_processus).erreur_systeme =
496: d_es_allocation_memoire;
497: return;
498: }
499:
500: if (((*((struct_matrice *) (*s_objet_statistique).objet))
501: .tableau = malloc(sizeof(integer8 **))) == NULL)
502: {
503: (*s_etat_processus).erreur_systeme =
504: d_es_allocation_memoire;
505: return;
506: }
507:
508: ((integer8 **) (*((struct_matrice *) (*s_objet_statistique)
509: .objet)).tableau)[0] = (*((struct_vecteur *)
510: (*s_objet).objet)).tableau;
511: }
512: else
513: {
514: if ((s_objet_statistique = allocation(s_etat_processus, MRL))
515: == NULL)
516: {
517: (*s_etat_processus).erreur_systeme =
518: d_es_allocation_memoire;
519: return;
520: }
521:
522: if (((*((struct_matrice *) (*s_objet_statistique).objet))
523: .tableau = malloc(sizeof(real8 **))) == NULL)
524: {
525: (*s_etat_processus).erreur_systeme =
526: d_es_allocation_memoire;
527: return;
528: }
529:
530: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
531: .objet)).tableau)[0] = (*((struct_vecteur *)
532: (*s_objet).objet)).tableau;
533: }
534:
535: (*((struct_matrice *) (*s_objet_statistique).objet))
536: .nombre_colonnes = (*((struct_vecteur *) (*s_objet).objet))
537: .taille;
538: (*((struct_matrice *) (*s_objet_statistique).objet))
539: .nombre_lignes = 1;
540:
541: free((struct_vecteur *) (*s_objet).objet);
542: free(s_objet);
543: s_objet = NULL;
544:
545: s_variable.objet = s_objet_statistique;
546:
547: if (creation_variable(s_etat_processus, &s_variable, 'V', 'P')
548: == d_erreur)
549: {
550: return;
551: }
552: }
553: else
554: {
555: /*
556: * La variable existe déjà, il faut lui rajouter une ligne.
557: */
558:
559: if (nombre_colonnes != (*((struct_vecteur *) (*s_objet).objet))
560: .taille)
561: {
562: (*s_etat_processus).erreur_execution =
563: d_ex_dimensions_matrice_statistique;
564:
565: liberation(s_etat_processus, s_objet);
566: return;
567: }
568:
569: s_objet_statistique = ((*s_etat_processus).s_liste_variables
570: [(*s_etat_processus).position_variable_courante]).objet;
571:
572: if (((*s_objet_statistique).type == MIN) &&
573: ((*s_objet).type == VIN))
574: {
575: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
576: .tableau;
577: (*((struct_matrice *) (*s_objet_statistique).objet))
578: .nombre_lignes++;
579:
580: if (((*((struct_matrice *) (*s_objet_statistique).objet))
581: .tableau = malloc((*((struct_matrice *)
582: (*s_objet_statistique).objet)).nombre_lignes *
583: sizeof(integer8 *))) == NULL)
584: {
585: (*s_etat_processus).erreur_systeme =
586: d_es_allocation_memoire;
587: return;
588: }
589:
590: for(i = 0; i < (long) ((*((struct_matrice *)
591: (*s_objet_statistique).objet)).nombre_lignes - 1); i++)
592: {
593: ((integer8 **) (*((struct_matrice *) (*s_objet_statistique)
594: .objet)).tableau)[i] = ((integer8 **) tampon)[i];
595: }
596:
597: free(tampon);
598:
599: ((integer8 **) (*((struct_matrice *) (*s_objet_statistique)
600: .objet)).tableau)[i] = (integer8 *)
601: (*((struct_vecteur *) (*s_objet).objet)).tableau;
602:
603: free((struct_vecteur *) (*s_objet).objet);
604: free(s_objet);
605: s_objet = NULL;
606: }
607: else if (((*s_objet_statistique).type == MRL) &&
608: ((*s_objet).type == VRL))
609: {
610: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
611: .tableau;
612: (*((struct_matrice *) (*s_objet_statistique).objet))
613: .nombre_lignes++;
614:
615: if (((*((struct_matrice *) (*s_objet_statistique).objet))
616: .tableau = malloc((*((struct_matrice *)
617: (*s_objet_statistique).objet)).nombre_lignes *
618: sizeof(real8 *))) == NULL)
619: {
620: (*s_etat_processus).erreur_systeme =
621: d_es_allocation_memoire;
622: return;
623: }
624:
625: for(i = 0; i < (long) ((*((struct_matrice *)
626: (*s_objet_statistique).objet)).nombre_lignes - 1); i++)
627: {
628: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
629: .objet)).tableau)[i] = ((real8 **) tampon)[i];
630: }
631:
632: free(tampon);
633:
634: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
635: .objet)).tableau)[i] = (real8 *)
636: (*((struct_vecteur *) (*s_objet).objet)).tableau;
637:
638: free((struct_vecteur *) (*s_objet).objet);
639: free(s_objet);
640: s_objet = NULL;
641: }
642: else if (((*s_objet_statistique).type == MRL) &&
643: ((*s_objet).type == VIN))
644: {
645: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
646: .tableau;
647: (*((struct_matrice *) (*s_objet_statistique).objet))
648: .nombre_lignes++;
649:
650: if (((*((struct_matrice *) (*s_objet_statistique).objet))
651: .tableau = malloc((*((struct_matrice *)
652: (*s_objet_statistique).objet)).nombre_lignes *
653: sizeof(real8 *))) == NULL)
654: {
655: (*s_etat_processus).erreur_systeme =
656: d_es_allocation_memoire;
657: return;
658: }
659:
660: for(i = 0; i < (long) ((*((struct_matrice *)
661: (*s_objet_statistique).objet)).nombre_lignes - 1); i++)
662: {
663: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
664: .objet)).tableau)[i] = ((real8 **) tampon)[i];
665: }
666:
667: free(tampon);
668:
669: if ((((real8 **) (*((struct_matrice *) (*s_objet_statistique)
670: .objet)).tableau)[i] =
671: malloc(nombre_colonnes * sizeof(real8))) == NULL)
672: {
673: (*s_etat_processus).erreur_systeme =
674: d_es_allocation_memoire;
675: return;
676: }
677:
678: for(j = 0; j < nombre_colonnes; j++)
679: {
680: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
681: .objet)).tableau)[i][j] =
682: (real8) (((integer8 *) (*((struct_vecteur *)
683: (*s_objet).objet)).tableau)[j]);
684: }
685: }
686: else
687: {
688: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
689: .tableau;
690: (*((struct_matrice *) (*s_objet_statistique).objet))
691: .nombre_lignes++;
692:
693: if (((*((struct_matrice *) (*s_objet_statistique).objet))
694: .tableau = malloc((*((struct_matrice *)
695: (*s_objet_statistique).objet)).nombre_lignes *
696: sizeof(real8 *))) == NULL)
697: {
698: (*s_etat_processus).erreur_systeme =
699: d_es_allocation_memoire;
700: return;
701: }
702:
703: for(i = 0; i < (long) ((*((struct_matrice *)
704: (*s_objet_statistique).objet)).nombre_lignes - 1); i++)
705: {
706: if ((((real8 **) (*((struct_matrice *)
707: (*s_objet_statistique).objet)).tableau)[i] =
708: malloc(nombre_colonnes * sizeof(real8))) == NULL)
709: {
710: (*s_etat_processus).erreur_systeme =
711: d_es_allocation_memoire;
712: return;
713: }
714:
715: for(j = 0; j < nombre_colonnes; j++)
716: {
717: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
718: .objet)).tableau)[i][j] = (real8)
719: ((integer8 **) tampon)[i][j];
720: }
721:
722: free(((integer8 **) tampon)[i]);
723: }
724:
725: free(tampon);
726:
727: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
728: .objet)).tableau)[i] = (real8 *) (*((struct_vecteur *)
729: (*s_objet).objet)).tableau;
730:
731: free((struct_vecteur *) (*s_objet).objet);
732: free(s_objet);
733: s_objet = NULL;
734:
735: (*((struct_matrice *) (*s_objet_statistique).objet)).type = 'R';
736: (*s_objet_statistique).type = MRL;
737: }
738: }
739: }
740:
741: /*
742: * Ajout d'une matrice
743: */
744:
745: else if (((*s_objet).type == MIN) ||
746: ((*s_objet).type == MRL))
747: {
748: if (creation_variable_sigma == d_vrai)
749: {
750: /*
751: * Création d'une matrice statistique NL*NC
752: */
753:
754: if ((s_variable.nom = malloc(6 * sizeof(unsigned char))) == NULL)
755: {
756: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
757: return;
758: }
759:
760: strcpy(s_variable.nom, ds_sdat);
761: s_variable.niveau = 1;
762:
763: if ((*s_objet).type == MIN)
764: {
765: if ((s_objet_statistique = allocation(s_etat_processus, MIN))
766: == NULL)
767: {
768: (*s_etat_processus).erreur_systeme =
769: d_es_allocation_memoire;
770: return;
771: }
772:
773: (*s_objet_statistique).objet = (*s_objet).objet;
774: }
775: else
776: {
777: if ((s_objet_statistique = allocation(s_etat_processus, MRL))
778: == NULL)
779: {
780: (*s_etat_processus).erreur_systeme =
781: d_es_allocation_memoire;
782: return;
783: }
784:
785: (*s_objet_statistique).objet = (*s_objet).objet;
786: }
787:
788: free(s_objet);
789: s_objet = NULL;
790:
791: s_variable.objet = s_objet_statistique;
792:
793: if (creation_variable(s_etat_processus, &s_variable, 'V', 'P')
794: == d_erreur)
795: {
796: return;
797: }
798: }
799: else
800: {
801: /*
802: * La variable existe déjà, il faut lui rajouter le nombre
803: * de lignes de la matrice passée en argument.
804: */
805:
806: if (nombre_colonnes != (*((struct_matrice *) (*s_objet).objet))
807: .nombre_colonnes)
808: {
809: (*s_etat_processus).erreur_execution =
810: d_ex_dimensions_matrice_statistique;
811:
812: liberation(s_etat_processus, s_objet);
813: return;
814: }
815:
816: s_objet_statistique = ((*s_etat_processus).s_liste_variables
817: [(*s_etat_processus).position_variable_courante]).objet;
818:
819: nombre_lignes = (*((struct_matrice *) (*s_objet).objet))
820: .nombre_lignes;
821:
822: if (((*s_objet_statistique).type == MIN) &&
823: ((*s_objet).type == MIN))
824: {
825: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
826: .tableau;
827: (*((struct_matrice *) (*s_objet_statistique).objet))
828: .nombre_lignes += nombre_lignes;
829:
830: if (((*((struct_matrice *) (*s_objet_statistique).objet))
831: .tableau = malloc((*((struct_matrice *)
832: (*s_objet_statistique).objet)).nombre_lignes *
833: sizeof(integer8 *))) == NULL)
834: {
835: (*s_etat_processus).erreur_systeme =
836: d_es_allocation_memoire;
837: return;
838: }
839:
840: for(i = 0; i < (long) ((*((struct_matrice *)
841: (*s_objet_statistique).objet)).nombre_lignes
842: - nombre_lignes); i++)
843: {
844: ((integer8 **) (*((struct_matrice *) (*s_objet_statistique)
845: .objet)).tableau)[i] = ((integer8 **) tampon)[i];
846: }
847:
848: free(tampon);
849:
850: for(k = 0; i < (long) ((*((struct_matrice *)
851: (*s_objet_statistique).objet)).nombre_lignes); i++, k++)
852: {
853: ((integer8 **) (*((struct_matrice *) (*s_objet_statistique)
854: .objet)).tableau)[i] = ((integer8 **)
855: (*((struct_matrice *) (*s_objet).objet))
856: .tableau)[k];
857: }
858:
859: free((integer8 **) (*((struct_matrice *) (*s_objet).objet))
860: .tableau);
861: free((struct_matrice *) (*s_objet).objet);
862: free(s_objet);
863: s_objet = NULL;
864: }
865: else if (((*s_objet_statistique).type == MRL) &&
866: ((*s_objet).type == MRL))
867: {
868: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
869: .tableau;
870: (*((struct_matrice *) (*s_objet_statistique).objet))
871: .nombre_lignes += nombre_lignes;
872:
873: if (((*((struct_matrice *) (*s_objet_statistique).objet))
874: .tableau = malloc((*((struct_matrice *)
875: (*s_objet_statistique).objet)).nombre_lignes *
876: sizeof(real8 *))) == NULL)
877: {
878: (*s_etat_processus).erreur_systeme =
879: d_es_allocation_memoire;
880: return;
881: }
882:
883: for(i = 0; i < (long) ((*((struct_matrice *)
884: (*s_objet_statistique).objet)).nombre_lignes
885: - nombre_lignes); i++)
886: {
887: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
888: .objet)).tableau)[i] = ((real8 **) tampon)[i];
889: }
890:
891: free(tampon);
892:
893: for(k = 0; i < (long) ((*((struct_matrice *)
894: (*s_objet_statistique).objet)).nombre_lignes); i++, k++)
895: {
896: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
897: .objet)).tableau)[i] = ((real8 **)
898: (*((struct_matrice *) (*s_objet).objet))
899: .tableau)[k];
900: }
901:
902: free((real8 **) (*((struct_matrice *) (*s_objet).objet))
903: .tableau);
904: free((struct_matrice *) (*s_objet).objet);
905: free(s_objet);
906: s_objet = NULL;
907: }
908: else if (((*s_objet_statistique).type == MRL) &&
909: ((*s_objet).type == MIN))
910: {
911: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
912: .tableau;
913: (*((struct_matrice *) (*s_objet_statistique).objet))
914: .nombre_lignes += nombre_lignes;
915:
916: if (((*((struct_matrice *) (*s_objet_statistique).objet))
917: .tableau = malloc((*((struct_matrice *)
918: (*s_objet_statistique).objet)).nombre_lignes *
919: sizeof(real8 *))) == NULL)
920: {
921: (*s_etat_processus).erreur_systeme =
922: d_es_allocation_memoire;
923: return;
924: }
925:
926: for(i = 0; i < (long) ((*((struct_matrice *)
927: (*s_objet_statistique).objet)).nombre_lignes
928: - nombre_lignes); i++)
929: {
930: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
931: .objet)).tableau)[i] = ((real8 **) tampon)[i];
932: }
933:
934: free(tampon);
935:
936: for(k = 0; i < (long) ((*((struct_matrice *)
937: (*s_objet_statistique).objet)).nombre_lignes); i++, k++)
938: {
939: if ((((real8 **) (*((struct_matrice *)
940: (*s_objet_statistique).objet)).tableau)[i] =
941: malloc(nombre_colonnes * sizeof(real8))) == NULL)
942: {
943: (*s_etat_processus).erreur_systeme =
944: d_es_allocation_memoire;
945: return;
946: }
947:
948: for(j = 0; j < nombre_colonnes; j++)
949: {
950: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
951: .objet)).tableau)[i][j] =
952: (real8) (((integer8 **) (*((struct_matrice *)
953: (*s_objet).objet)).tableau)[k][j]);
954: }
955: }
956: }
957: else
958: {
959: tampon = (*((struct_matrice *) (*s_objet_statistique).objet))
960: .tableau;
961: (*((struct_matrice *) (*s_objet_statistique).objet))
962: .nombre_lignes += nombre_lignes;
963:
964: if (((*((struct_matrice *) (*s_objet_statistique).objet))
965: .tableau = malloc((*((struct_matrice *)
966: (*s_objet_statistique).objet)).nombre_lignes *
967: sizeof(real8 *))) == NULL)
968: {
969: (*s_etat_processus).erreur_systeme =
970: d_es_allocation_memoire;
971: return;
972: }
973:
974: for(i = 0; i < (long) ((*((struct_matrice *)
975: (*s_objet_statistique).objet)).nombre_lignes
976: - nombre_lignes); i++)
977: {
978: if ((((real8 **) (*((struct_matrice *)
979: (*s_objet_statistique).objet)).tableau)[i] =
980: malloc(nombre_colonnes * sizeof(real8)))
981: == NULL)
982: {
983: (*s_etat_processus).erreur_systeme =
984: d_es_allocation_memoire;
985: return;
986: }
987:
988: for(j = 0; j < nombre_colonnes; j++)
989: {
990: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
991: .objet)).tableau)[i][j] = (real8)
992: ((integer8 **) tampon)[i][j];
993: }
994:
995: free(((integer8 **) tampon)[i]);
996: }
997:
998: free(tampon);
999:
1000: for(k = 0; i < (long) ((*((struct_matrice *)
1001: (*s_objet_statistique).objet)).nombre_lignes); i++, k++)
1002: {
1003: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
1004: .objet)).tableau)[i] = ((real8 **)
1005: (*((struct_matrice *) (*s_objet).objet))
1006: .tableau)[k];
1007: }
1008:
1009: free((real8 **) (*((struct_matrice *) (*s_objet).objet))
1010: .tableau);
1011: free((struct_matrice *) (*s_objet).objet);
1012: free(s_objet);
1013: s_objet = NULL;
1014:
1015: (*((struct_matrice *) (*s_objet_statistique).objet)).type = 'R';
1016: (*s_objet_statistique).type = MRL;
1017: }
1018: }
1019: }
1020:
1021: /*
1022: * Type incompatible en entrée
1023: */
1024:
1025: else
1026: {
1027: liberation(s_etat_processus, s_objet);
1028:
1029: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1030: return;
1031: }
1032:
1033: liberation(s_etat_processus, s_objet);
1034:
1035: return;
1036: }
1037:
1038:
1039: /*
1040: ================================================================================
1041: Fonction 's-'
1042: ================================================================================
1043: Entrées : structure processus
1044: --------------------------------------------------------------------------------
1045: Sorties :
1046: --------------------------------------------------------------------------------
1047: Effets de bord : néant
1048: ================================================================================
1049: */
1050:
1051: void
1052: instruction_s_moins(struct_processus *s_etat_processus)
1053: {
1054: logical1 presence_variable;
1055:
1056: long i;
1057:
1058: struct_objet *s_copie_statistique;
1059: struct_objet *s_objet;
1060: struct_objet *s_objet_statistique;
1061:
1062: unsigned long nombre_colonnes;
1063: unsigned long nombre_lignes;
1064:
1065: void *tampon;
1066:
1067: (*s_etat_processus).erreur_execution = d_ex;
1068:
1069: if ((*s_etat_processus).affichage_arguments == 'Y')
1070: {
1071: printf("\n S- ");
1072:
1073: if ((*s_etat_processus).langue == 'F')
1074: {
1075: printf("(retrait une donnée dans la matrice statistique)\n\n");
1076: }
1077: else
1078: {
1079: printf("(remove a data value from statistical matrix)\n\n");
1080: }
1081:
1082: printf("-> 1: %s, %s, %s, %s\n", d_INT, d_REL, d_VIN, d_VRL);
1083:
1084: return;
1085: }
1086: else if ((*s_etat_processus).test_instruction == 'Y')
1087: {
1088: (*s_etat_processus).nombre_arguments = -1;
1089: return;
1090: }
1091:
1092: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1093: {
1094: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1095: {
1096: return;
1097: }
1098: }
1099:
1100: /*
1101: * Recherche d'une variable globale référencée par SIGMA
1102: */
1103:
1104: if (recherche_variable(s_etat_processus, ds_sdat) == d_faux)
1105: {
1106: /*
1107: * Aucune variable SIGMA
1108: */
1109:
1110: (*s_etat_processus).erreur_systeme = d_es;
1111: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
1112: return;
1113: }
1114: else
1115: {
1116: /*
1117: * Il existe une variable locale SIGMA. Reste à vérifier l'existence
1118: * d'une variable SIGMA globale...
1119: */
1120:
1121: i = (*s_etat_processus).position_variable_courante;
1122: presence_variable = d_faux;
1123:
1124: while(i >= 0)
1125: {
1126: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
1127: ds_sdat) == 0) && ((*s_etat_processus)
1128: .s_liste_variables[i].niveau == 1))
1129: {
1130: presence_variable = d_vrai;
1131: break;
1132: }
1133:
1134: i--;
1135: }
1136:
1137: if (presence_variable == d_faux)
1138: {
1139: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
1140: return;
1141: }
1142: else
1143: {
1144: (*s_etat_processus).position_variable_courante = i;
1145:
1146: if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
1147: .position_variable_courante].variable_verrouillee ==
1148: d_vrai)
1149: {
1150: (*s_etat_processus).erreur_execution =
1151: d_ex_variable_verrouillee;
1152: return;
1153: }
1154:
1155: if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
1156: {
1157: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
1158: return;
1159: }
1160:
1161: if (((*((*s_etat_processus).s_liste_variables
1162: [(*s_etat_processus).position_variable_courante].objet))
1163: .type != MIN) && ((*((*s_etat_processus)
1164: .s_liste_variables[(*s_etat_processus)
1165: .position_variable_courante].objet)).type != MRL))
1166: {
1167: (*s_etat_processus).erreur_execution =
1168: d_ex_matrice_statistique_invalide;
1169: return;
1170: }
1171:
1172: if ((s_copie_statistique = copie_objet(s_etat_processus,
1173: (*s_etat_processus)
1174: .s_liste_variables[(*s_etat_processus)
1175: .position_variable_courante].objet, 'O')) == NULL)
1176: {
1177: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1178: return;
1179: }
1180:
1181: liberation(s_etat_processus, (*s_etat_processus).s_liste_variables
1182: [(*s_etat_processus).position_variable_courante].objet);
1183: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
1184: .position_variable_courante].objet = s_copie_statistique;
1185:
1186: nombre_colonnes = (*((struct_matrice *) (*((*s_etat_processus)
1187: .s_liste_variables[(*s_etat_processus)
1188: .position_variable_courante].objet)).objet))
1189: .nombre_colonnes;
1190:
1191: nombre_lignes = (*((struct_matrice *) (*((*s_etat_processus)
1192: .s_liste_variables[(*s_etat_processus)
1193: .position_variable_courante].objet)).objet))
1194: .nombre_lignes;
1195: }
1196: }
1197:
1198: s_objet_statistique = ((*s_etat_processus).s_liste_variables
1199: [(*s_etat_processus).position_variable_courante]).objet;
1200:
1201: if ((*s_objet_statistique).type == MIN)
1202: {
1203: if (nombre_colonnes == 1)
1204: {
1205: /*
1206: * Formation d'un entier
1207: */
1208:
1209: if ((s_objet = allocation(s_etat_processus, NON)) == NULL)
1210: {
1211: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1212: return;
1213: }
1214:
1215: (*s_objet).type = INT;
1216:
1217: if (nombre_lignes == 1)
1218: {
1219: if (((*s_objet).objet = malloc(sizeof(integer8))) == NULL)
1220: {
1221: (*s_etat_processus).erreur_systeme =
1222: d_es_allocation_memoire;
1223: return;
1224: }
1225:
1226: (*((integer8 *) (*s_objet).objet)) = ((integer8 **)
1227: (*((struct_matrice *) (*s_objet_statistique).objet))
1228: .tableau)[nombre_lignes - 1][0];
1229: }
1230: else
1231: {
1232: (*s_objet).objet = ((integer8 **)
1233: (*((struct_matrice *) (*s_objet_statistique).objet))
1234: .tableau)[nombre_lignes - 1];
1235: }
1236: }
1237: else
1238: {
1239: /*
1240: * Formation d'un vecteur d'entiers
1241: */
1242:
1243: if ((s_objet = allocation(s_etat_processus, NON)) == NULL)
1244: {
1245: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1246: return;
1247: }
1248:
1249: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
1250: {
1251: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1252: return;
1253: }
1254:
1255: (*s_objet).type = VIN;
1256: (*((struct_vecteur *) (*s_objet).objet)).type = 'I';
1257: (*((struct_vecteur *) (*s_objet).objet)).taille = nombre_colonnes;
1258:
1259: if (nombre_lignes == 1)
1260: {
1261: if (((*((struct_vecteur *) (*s_objet).objet))
1262: .tableau = malloc(nombre_colonnes *
1263: sizeof(integer8))) == NULL)
1264: {
1265: (*s_etat_processus).erreur_systeme =
1266: d_es_allocation_memoire;
1267: return;
1268: }
1269:
1270: for(i = 0; i < (long) nombre_colonnes; i++)
1271: {
1272: ((integer8 *) (*((struct_vecteur *) (*s_objet).objet))
1273: .tableau)[i] = ((integer8 **) (*((struct_matrice *)
1274: (*s_objet_statistique).objet)).tableau)
1275: [nombre_lignes - 1][i];
1276: }
1277: }
1278: else
1279: {
1280: (*((struct_vecteur *) (*s_objet).objet)).tableau =
1281: ((integer8 **) (*((struct_matrice *)
1282: (*s_objet_statistique).objet)).tableau)
1283: [nombre_lignes - 1];
1284: }
1285: }
1286:
1287: if (nombre_lignes == 1)
1288: {
1289: /*
1290: * Destruction de la variable globale SIGMA
1291: */
1292:
1293: if (retrait_variable(s_etat_processus, ds_sdat, 'G') == d_erreur)
1294: {
1295: return;
1296: }
1297: }
1298: else
1299: {
1300: /*
1301: * Elimination de la dernière ligne de la matrice SIGMA
1302: */
1303:
1304: tampon = (*((struct_matrice *) (*s_objet_statistique)
1305: .objet)).tableau;
1306: (*((struct_matrice *) (*s_objet_statistique).objet))
1307: .nombre_lignes--;
1308:
1309: if (((*((struct_matrice *) (*s_objet_statistique)
1310: .objet)).tableau = malloc(
1311: (*((struct_matrice *) (*s_objet_statistique).objet))
1312: .nombre_lignes * sizeof(integer8 *))) == NULL)
1313: {
1314: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1315: return;
1316: }
1317:
1318: for(i = 0; i < (long) (*((struct_matrice *) (*s_objet_statistique)
1319: .objet)).nombre_lignes; i++)
1320: {
1321: ((integer8 **) (*((struct_matrice *) (*s_objet_statistique)
1322: .objet)).tableau)[i] = ((integer8 **) tampon)[i];
1323: }
1324:
1325: free(tampon);
1326: }
1327: }
1328: else if ((*s_objet_statistique).type == MRL)
1329: {
1330: if (nombre_colonnes == 1)
1331: {
1332: /*
1333: * Formation d'un réel
1334: */
1335:
1336: if ((s_objet = allocation(s_etat_processus, NON)) == NULL)
1337: {
1338: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1339: return;
1340: }
1341:
1342: (*s_objet).type = REL;
1343:
1344: if (nombre_lignes == 1)
1345: {
1346: if (((*s_objet).objet = malloc(sizeof(real8)))
1347: == NULL)
1348: {
1349: (*s_etat_processus).erreur_systeme =
1350: d_es_allocation_memoire;
1351: return;
1352: }
1353:
1354: (*((real8 *) (*s_objet).objet)) = ((real8 **)
1355: (*((struct_matrice *) (*s_objet_statistique).objet))
1356: .tableau)[nombre_lignes - 1][0];
1357: }
1358: else
1359: {
1360: (*s_objet).objet = ((real8 **)
1361: (*((struct_matrice *) (*s_objet_statistique).objet))
1362: .tableau)[nombre_lignes - 1];
1363: }
1364: }
1365: else
1366: {
1367: /*
1368: * Formation d'un vecteur de réels
1369: */
1370:
1371: if ((s_objet = allocation(s_etat_processus, NON)) == NULL)
1372: {
1373: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1374: return;
1375: }
1376:
1377: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
1378: {
1379: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1380: return;
1381: }
1382:
1383: (*s_objet).type = VRL;
1384: (*((struct_vecteur *) (*s_objet).objet)).type = 'R';
1385: (*((struct_vecteur *) (*s_objet).objet)).taille = nombre_colonnes;
1386:
1387: if (nombre_lignes == 1)
1388: {
1389: if (((*((struct_vecteur *) (*s_objet).objet))
1390: .tableau = malloc(nombre_colonnes *
1391: sizeof(real8))) == NULL)
1392: {
1393: (*s_etat_processus).erreur_systeme =
1394: d_es_allocation_memoire;
1395: return;
1396: }
1397:
1398: for(i = 0; i < (long) nombre_colonnes; i++)
1399: {
1400: ((real8 *) (*((struct_vecteur *) (*s_objet).objet))
1401: .tableau)[i] = ((real8 **) (*((struct_matrice *)
1402: (*s_objet_statistique).objet)).tableau)
1403: [nombre_lignes - 1][i];
1404: }
1405: }
1406: else
1407: {
1408: (*((struct_vecteur *) (*s_objet).objet)).tableau =
1409: ((real8 **) (*((struct_matrice *)
1410: (*s_objet_statistique).objet)).tableau)
1411: [nombre_lignes - 1];
1412: }
1413: }
1414:
1415: if (nombre_lignes == 1)
1416: {
1417: /*
1418: * Destruction de la variable globale SIGMA
1419: */
1420:
1421: if (retrait_variable(s_etat_processus, ds_sdat, 'G') == d_erreur)
1422: {
1423: return;
1424: }
1425: }
1426: else
1427: {
1428: /*
1429: * Elimination de la dernière ligne de la matrice SIGMA
1430: */
1431:
1432: tampon = (*((struct_matrice *) (*s_objet_statistique)
1433: .objet)).tableau;
1434: (*((struct_matrice *) (*s_objet_statistique).objet))
1435: .nombre_lignes--;
1436:
1437: if (((*((struct_matrice *) (*s_objet_statistique).objet))
1438: .tableau = malloc((*((struct_matrice *)
1439: (*s_objet_statistique).objet)).nombre_lignes *
1440: sizeof(real8 *))) == NULL)
1441: {
1442: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1443: return;
1444: }
1445:
1446: for(i = 0; i < (long) (*((struct_matrice *) (*s_objet_statistique)
1447: .objet)).nombre_lignes; i++)
1448: {
1449: ((real8 **) (*((struct_matrice *) (*s_objet_statistique)
1450: .objet)).tableau)[i] = ((real8 **) tampon)[i];
1451: }
1452:
1453: free(tampon);
1454: }
1455: }
1456: else
1457: {
1458: (*s_etat_processus).erreur_execution =
1459: d_ex_matrice_statistique_invalide;
1460: return;
1461: }
1462:
1463: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1464: s_objet) == d_erreur)
1465: {
1466: return;
1467: }
1468:
1469: return;
1470: }
1471:
1472: // vim: ts=4