transtypage

Une définition du Jargon Français.
Aller à : Navigation, rechercher

nom masculin.  [programmation]. Action de programmation, effectuée dans un code source, visant à modifier à la volée le type d'une grandeur ou d'une variable.

Verbe associé : convertir.

Parfois écrit « trans-typage ».

En anglais : casting, le verbe étant to cast.

Synonyme caster, forcer le type.

Exemple en C

Voici un code source en langage C.

Notes :

  • supprimer les numéros de lignes afin de tenter de compiler
  • les commentaires se trouvent entre « /* » et « */ »
  • il s'agit d'un programme d'illustration, qui n'accomplit rien d'utile
1 #include <stdio.h> /* cuisine interne, ne pas s'en soucier */
2
3 int main(void) /* fonction principale du programme */
4 {
5  void *pnt;
6
7  int foo = 1;  /* déclaration d'une variable entière contenant 1 */
8
9  pnt = &foo; /* l'opérateur '&' retourne l'adresse de la variable dont il précède le nom, donc après cette ligne
    le pointeur pointe vers la variable entière puisqu'il contient son adresse */
 
10  printf("Valeur : %d", *pnt);
/* l'opérateur '*' est le complément de '&', il retourne l'objet dont l'adresse est la valeur contenue dans le pointeur.
   L'exécution de cela devrait "afficher" la valeur décimale entière (c'est ce qu'exprime "%d") pointée par "pnt" */
 
  return 0; /* cuisine externe, ne pas s'en soucier */
 }

En ligne 5 on déclare une variable nommée pnt de type pointeur (c'est ce qu'indique l'astérisque). void signifie ici « sans déclaration du type des objets vers lesquels elle peut pointer ». C'est utile lorsque l'on sait qu'elle servira parfois à pointer sans que l'on sache vers quoi, par exemple lorsque les éléments pointables relèvent de plusieurs types distincts.

En ligne 9 on l'initialise de sorte qu'elle pointe vers l'adresse de la variable foo.

Le compilateur gcc n'apprécie pas ce source et commente :

toto.c:10: warning: dereferencing 'void *' pointer
toto.c:10: error: void value not ignored as it ought to be

Il refuse de produire du code faisant quoi que ce soit avec ce qui se trouve dans un pointeur void, comme nous tentons de de faire ligne 10. Il fait bien, parce que ce genre de gag cause souvent effet de bord, bogue, (sous Unix : SIGSEGV) voire buffer overflow.

Afin d'exprimer « cher compilateur, tu peux considérer que pnt est un pointeur vers un entier, je suis catégorique, il n'y a pas de souci » nous modifions la ligne 10 de sorte qu'elle devienne :

printf("Valeur : %d", *(int *) ||  pnt);

au lieu de :

printf("Valeur : %d", *pnt);

, donc ajouter (int *), suffit.

Ce transtypage contente gcc.