SCR/AL1 - TOME III. Les librairies utilitaires
Le groupe s_xdr contient une liste de fonctions permettant de gérer les problèmes de représentation de données numériques. En effet, chaque processeur, voire chaque OS sur un même processeur a sa façon propre de stocker les long, double, float, etc.
La question qui se pose lorsqu'on travaille dans un environnement où différents processeurs sont utilisés sur les mêmes données est de trouver un façon standard de stocker ces données. L'intérêt est que ces données peuvent être stockées et lues sur un serveur de fichier par n'importe quel système, indépendamment du processeur.
L'inconvénient est qu'il faut recourir à des fonctions, donc ralentir les lectures et les écritures, dès qu'un accès aux données doit être réalisé.
Dans l'état actuel des choses, les systèmes suivants sont gérés :
Hypothèse
On prend comme hypothèse de travail qu'un même type occupe toujours le même nombre de bytes, quelque soit le système utilisé. Cela signifie en particulier qu'il faut éviter les types int qui varient en fonction de l'architecture de la machine. On les remplacera facilement par des short ou des long.
Types de données
Les seuls types de données qui posent problème - et qui sont couramment utilisés - sont les types numériques de base, connus de tous les compilateurs C :
Le type char, unsigned char ne posant pas de problème, aucune fonction n'est écrite pour ces deux cas. Les autres types (long double, complex, enum) n'existent pas sur tous les compilateurs et sont donc d'emblée évités.
Le type int ne répondant pas à l'hypothèse qui précède, il n'est pas repris. A charge du programmeur ne n'utiliser que des short ou des long.
Représentation des données
Pour des raisons de performance, la représentation choisie est celle du processeur INTEL, même si elle n'est pas la plus logique.
Définition de l'architecture
L'architecture de la machine cible doit être connue au moment de la compilation d'un programme utilisant s_xdr. En général, un #define est passé comme paramètre au compilateur :
cc -c -DINTEL test.c
Les #define à utiliser en fonction du système sont :
La limitation à deux cas (INTEL ou rien) s'explique par le fait que dans les architectures décrites, il n'y a que deux formats distincts.
Deux groupes de fonctions sont implémentés :
Toutes les fonctions de ce groupe opèrent sur des pointeurs vers des valeurs.
Fonctions de base
Les compilateurs de gèrent pas tous de la même façon le passage des arguments de fonctions en C. Par exemple, dans le compilateur SUN-OS, un float est transformé en double lors du passage d'argument. La fonction suivante ne donne par conséquent pas des résultats attendus : les 4 bytes écrits sont les "premiers" du double correspondant au float passé comme argument. Or, ceux-ci ne suffisent pas à donner la valeur du float. A la relecture, le résultat sera erroné!
WriteFloat(fd, f)
FILE *fd;
float f;
{
fwrite(&f, sizeof(float), 1, fd);
}
Leur nom répond à la logique suivante :
XDR_ {l2s | s2l} _ {s | l | f | d}
où
s indique short
l indique long
f indique float
d indique double
l2s signifie local vers standard
s2l signifie standard vers local
Fonctions lecture/écriture (fichier)
Copyright © 1998-2015 Jean-Marc Paul and Bernard PAUL - Envoyez vos remarques ou commentaires à bernard@xon.be