Présentation
Documentation
L'équipe
Sérialisation
 
Programmes
Objets
Libs Utilitaires
Libs Internes
   
 
Editeur
Syntaxes
Windows
Versions
   

SCR/AL1 - TOME III. Les librairies utilitaires

13. Le groupe s_xdr

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}

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)

13.1 XDR_l2s_s

13.2 XDR_s2l_s

13.3 XDR_l2s_l

13.4 XDR_s2l_l

13.5 XDR_l2s_f

13.6 XDR_s2l_f

13.7 XDR_l2s_d

13.8 XDR_s2l_d

13.9 XDR_wshort

13.10 XDR_rshort

13.11 XDR_wlong

13.12 XDR_rlong

13.13 XDR_wfloat

13.14 XDR_rfloat

13.15 XDR_wdouble

13.16 XDR_rdouble

Copyright © 1998-2015 Jean-Marc Paul and Bernard PAUL - Envoyez vos remarques ou commentaires à bernard@xon.be