TD 8

Vendredi 21 mars 2003

On désire écrire un module Int16 permettant de manipuler des entiers non signés codés sur deux octets au format « gros-boutiste » (big-endian). Pour cela, nous allons interfacer des fonctions écrites en C avec du OCaml. En C, les entiers non signés codés sur deux entiers peuvent être directement manipulés via le type primitif unsigned short et les macros htons()1 (host to network short) et ntohs()2 permettent de passer de la représentation utilisée par la machine hôte pour coder les entiers à la représentation réseau (gros-boutiste).

Si les déclarations de fonctions Ocaml sont écrites dans le fichier int16.ml et les fonctions C dans le fichier ml_int16.c, il est possible de générer le fichier int16 avec la commande
      
        ocamlc -custom -o int16 ml_int16.c int16.ml
ou mode bytecodé ou bien
      
        ocamlopt -o int16 ml_int16.c int16.ml
en mode natif.

1  Conversion de string vers int

Écrire en Ocaml la déclaration d'une fonction read_int16_from_string qui prend en arguments une chaîne de caractères et un décalage et qui retourne un entier correspondant à la valeur entière codée sur deux octets stockée dans la chaîne de caractère avec ce décalage. Cette fonction fait appel à la fonction C ml_read_int16_from_string()

Pour tester votre fonction, placer deux caractères dans une chaîne de caractères, les relire sous forme d'entier non signé et comparer la valeur avec celle obtenue à partir d'un calcul utilisant leur code ASCII (Chr.code).
(corrigé)
Écrire la fonction C correspondante. On fera attention à vérifier que tous les arguments sont valides. Si un argument n'est pas valide lever une exception invalid_argument.
(corrigé)

2  La conversion inverse

Déclarer une fonction Ocaml write_int16_to_string et écrire la fonction C correspondante ml_write_int16_to_string() effectuant la conversion inverse. La chaîne de caractères et le décalage où l'entier devra être stocké seront passés en arguments.

Testez votre fonction en utilisant la fonction précdente.
(corrigé)

3  Manipulation de tableau et allocation

Déclarer une fonction Ocaml string_of_array et écrire la fonction C correspondante ml_string_of_array () qui prend en argument un tableau d'entiers et qui renvoie une chaîne de caractères contenant ces entiers dans le codage que nous avons défini.

Tester votre fonction en utilisant la fonction read_int16_from_string.
(corrigé)



This document was translated from LATEX by HEVEA and HACHA.