2.4. Compatibilité et conversion de types

Lors d'une affectation, de l'évaluation d'expressions ou du passage de paramètres à une procédure, on peut être en présence d'objets (variables, constantes ou littéraux) de types différents. Cette combinaison de types pourra être acceptable ou non selon certaines règles qui dépendent du langage. Pour le langage PASCAL, les règles sont les suivantes :

2.4.1. Compatibilité

Exemple d'expression ambiguë : A = B and C = D

A = B and C = D pourrait être interprété comme ((A=B) and C) = D, ce qui impliquerait que C et D soient booléens pour que l'expression soit valide;

une autre interprétation serait A = (B and (C=D)), qui serait valide si A et B étaient booléens;

une troisième interprétation serait A = ((B and C) = D), ce qui impliquerait que A, B, C et D soient booléens;

finalement, une quatrième interprétation serait (A=B) and (C=D), ce qui impliquerait que A soit de type compatible avec B et C compatible avec D.

Cette ambiguïté est parfois levée par la spécification de règles de précédence indiquant dans quel ordre les opérations d'une expression doivent être évaluées.

Les règles sont les mêmes que pour l'affectation, avec, au lieu de la variable à gauche de l'affectation, le paramètre formel et, au lieu de l'expression à droite, le paramètre effectif.

2.4.2. Conversion de type

La conversion de type, en PASCAL, est généralement faite explicitement à l'aide de fonctions de conversions. Seule la conversion entier ->réel est faite implicitement lorsque c'est nécessaire. Les fonctions de conversions prédéfinies sont :

fonction

      type de l'argument

          type de résultat

ord

discret

entier

chr

entier

caractère

trunc

réel

entier

round

réel

entier

Le langage ADA impose, quant à lui, des contraintes beaucoup plus strictes. Il fait la distinction entre types dérivés et sous-types. Un sous-type, de même qu'un type dérivé, consiste en une restriction apportée à un type de base. Un sous-type reste compatible avec son type de base alors qu'un type dérivé est incompatible avec son type de base.

Exemples

       subtype OneDigit is integer range 0..9;  
       subtype JourOuvrable is Semaine   
               range Lundi..Vendredi;  
       type Entier is new integer;   
       type MilieuDeSemaine is new Semaine   
            range Mardi..Jeudi;  

Dans les exemples qui précèdent,

OneDigit est compatible avec integer,
JourOuvrable est compatible avec Semaine,
mais Entier n'est pas compatible avec integer
et MilieuDeSemaine n'est pas compatible avec Semaine.

Il est toutefois possible de faire une conversion explicite d'un type dérivé vers son type de base (ou vice-versa) en préfixant l'objet du type à convertir par le type du résultat. Par exemple, si Jour est une variable de type Semaine, MilieuDeSemaine(Jour) est de type MilieuDeSemaine (il y aura erreur si la valeur associée à la variable Jour n'est pas comprise dans l'ensemble des valeurs possibles pour le type MilieuDeSemaine ).

L'intérêt de cette distinction entre types dérivés et sous-types est une fois encore au niveau de la sécurité de programmation. Par exemple, si une variable est sensée représenter une superficie et une autre variable sensée représenter une longueur, cela n'aurait pas beaucoup de sens de vouloir les additionner, même si elles sont toutes les deux des valeurs numériques entières.

Modula-2, quant à lui, est très similaire au Pascal sur ce plan, au détail près qu'il n'a pas de conversion explicite d'entiers en réels. A la place, il faut utiliser une fonction de conversion ( float ).

3. Les structures statiques

Table des matières.

Site Hosting: Bronco