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 :
type de la variable à gauche de l'affectation | type de l'expression à droite de l'affectation |
réel | entier ou intervalle d'entiers |
type de | type des composants |
entier | entier ou intervalle d'entier |
Il est à noter que les opérateurs de comparaison admettent
des arguments de n'importe quel type de base pourvu que les types des deux
arguments soient compatibles au sens de l'affectation; le résultat,
lui, est toujours de type booléen. A cause de cela, l'utilisation
des parenthèses est parfois nécessaire pour ôter certaines
ambiguïtés dans l'expression.
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.
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 )
.
Site Hosting: Bronco