© Éditions Eyrolles
103
chapitre n° 6
La programmation modulaire et les fonctions
sera traduit par :
●
l’évaluation de la valeur de l’expression n+1 (en int) et sa conversion en float,
●
l’évaluation de la valeur de l’expression 2*x (en float) et sa conversion en int ; il y a
donc dans ce dernier cas une conversion dégradante.
Rappelons que, lorsque le compilateur ne connaît pas le type des arguments d’une fonction, il
utilise des règles de conversions systématiques : char et short -> int et float -> double.
La fonction printf est précisément dans ce cas.
Compte tenu de la remarque précédente, seule une fonction déclarée avec un prototype
pourra recevoir un argument de type float, char ou short.
5 Retour sur les fichiers en-tête
Nous avons déjà dit qu’il existe un certain nombre de fichiers d’extension .h, correspondant
chacun à une classe de fonctions. On y trouve, entre autres choses, les prototypes de ces
fonctions.
Ce point se révèle fort utile :
●
d’une part pour effectuer des contrôles sur le nombre et le type des arguments mentionnés
dans les appels de ces fonctions,
●
d’autre part pour forcer d’éventuelles conversions auxquelles on risque de ne pas penser.
À titre d’illustration de ce dernier aspect, supposez que vous ayez écrit ces instructions :
float x, y ;
.....
y = sqrt (x) ;
.....
sans les faire précéder d’une quelconque directive #include.
Elles produiraient alors des résultats faux. En effet, il se trouve que la fonction sqrt s’attend
à recevoir un argument de type double (ce qui sera le cas ici, compte tenu des conversions
implicites), et elle fournit un résultat de type double. Or, lors de la traduction de votre
programme, le compilateur ne le sait pas. Il attribue donc d’office à sqrt le type int et il met
en place une conversion de la valeur de retour (laquelle sera en fait de type double) en int.
On se trouve en présence des conséquences habituelles d’une mauvaise interprétation de type.
Un premier remède consiste à placer dans votre module la déclaration :
double sqrt(double) ;
mais encore faut-il que vous connaissiez de façon certaine le type de cette fonction.
Delannoy Livre.book Page 103 Mercredi, 6. mai 2009 4:26 16
103
chapitre n° 6
La programmation modulaire et les fonctions
sera traduit par :
●
l’évaluation de la valeur de l’expression n+1 (en int) et sa conversion en float,
●
l’évaluation de la valeur de l’expression 2*x (en float) et sa conversion en int ; il y a
donc dans ce dernier cas une conversion dégradante.
Rappelons que, lorsque le compilateur ne connaît pas le type des arguments d’une fonction, il
utilise des règles de conversions systématiques : char et short -> int et float -> double.
La fonction printf est précisément dans ce cas.
Compte tenu de la remarque précédente, seule une fonction déclarée avec un prototype
pourra recevoir un argument de type float, char ou short.
5 Retour sur les fichiers en-tête
Nous avons déjà dit qu’il existe un certain nombre de fichiers d’extension .h, correspondant
chacun à une classe de fonctions. On y trouve, entre autres choses, les prototypes de ces
fonctions.
Ce point se révèle fort utile :
●
d’une part pour effectuer des contrôles sur le nombre et le type des arguments mentionnés
dans les appels de ces fonctions,
●
d’autre part pour forcer d’éventuelles conversions auxquelles on risque de ne pas penser.
À titre d’illustration de ce dernier aspect, supposez que vous ayez écrit ces instructions :
float x, y ;
.....
y = sqrt (x) ;
.....
sans les faire précéder d’une quelconque directive #include.
Elles produiraient alors des résultats faux. En effet, il se trouve que la fonction sqrt s’attend
à recevoir un argument de type double (ce qui sera le cas ici, compte tenu des conversions
implicites), et elle fournit un résultat de type double. Or, lors de la traduction de votre
programme, le compilateur ne le sait pas. Il attribue donc d’office à sqrt le type int et il met
en place une conversion de la valeur de retour (laquelle sera en fait de type double) en int.
On se trouve en présence des conséquences habituelles d’une mauvaise interprétation de type.
Un premier remède consiste à placer dans votre module la déclaration :
double sqrt(double) ;
mais encore faut-il que vous connaissiez de façon certaine le type de cette fonction.
Delannoy Livre.book Page 103 Mercredi, 6. mai 2009 4:26 16
