--- rpl/src/types.c 2011/11/26 10:01:33 1.42 +++ rpl/src/types.c 2011/12/02 11:17:59 1.43 @@ -3522,28 +3522,64 @@ recherche_type(struct_processus *s_etat_ } else { - (*s_objet).type = INT; + // Le format ressemble à un entier mais il peut y avoir + // un dépassement de capacité lors de la conversion. + // On convertit donc en entier et en réel. Si les + // deux conversions donnent le même résultat, on + // considère que la conversion en entier est bonne. Dans + // le cas contraire, on garde la conversion en réel. - element = (void *) ((integer8 *) malloc( - sizeof(integer8))); + integer8 conversion_entiere; + real8 conversion_reelle; - if (element == NULL) + if (sscanf((*s_etat_processus).instruction_courante, "%lg", + &conversion_reelle) != 1) { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - (*s_etat_processus).traitement_interruptible = - registre_interruption; - return; + (*s_etat_processus).erreur_execution = d_ex_syntaxe; } - nombre_elements_convertis = sscanf( - (*s_etat_processus).instruction_courante, "%lld", - (integer8 *) element); - - if (nombre_elements_convertis != 1) + if (sscanf((*s_etat_processus).instruction_courante, "%lld", + &conversion_entiere) != 1) { (*s_etat_processus).erreur_execution = d_ex_syntaxe; } + + if (abs(nextafter(conversion_reelle, conversion_entiere) + - conversion_reelle) >= abs(conversion_reelle + - conversion_entiere)) + { + (*s_objet).type = INT; + + element = malloc(sizeof(integer8)); + + if (element == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).traitement_interruptible = + registre_interruption; + return; + } + + (*((integer8 *) element)) = conversion_entiere; + } + else + { + (*s_objet).type = REL; + + element = malloc(sizeof(real8)); + + if (element == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).traitement_interruptible = + registre_interruption; + return; + } + + (*((real8 *) element)) = conversion_reelle; + } } }