IN3A11-2 : Sujet du TP11
Groupe ESIEE, Denis BUREAU, novembre 2007, v1.
1 Les objectifs
ˆ
Etre capable
1. d’utiliser les fichiers de texte en C,
2. de r´ealiser des programmes compos´es de modules compil´es s´epar´ement,
3. d’automatiser la construction de ces programmes,
4. d’appeler du C depuis Java et d’´echanger des donn´ees.
Et continuer le projet Sokoban.
2 Compilation s´epar´ee
1. Cr´eez un nouveau r´epertoire (tp11?) et recopiez-y une version fonctionnelle de sokoban2.c (au
moins les 3 premi`eres it´erations du TP10) en l’appelant main.c .
2. Dupliquez ce fichier en 9 nouveaux fichiers appel´es : types.h, util.c, protos-util.h, init.c,
protos-init.h, joue.c, protos-joue.h, undo.c, protos-undo.h
(seulement 7 nouveaux fichiers si vous n’avez pas fait undo).
3. ´
Editez chacun des 10 (ou 8) fichiers pour qu’il ne contienne plus que :
types.h : tous les typedef
main.c : la constante MAXCH et la fonction main()
util.c :afficheGrille(), error(), aide(), acces()
init.c :getSokoban(), initMurs(), nouveauJeu(), verifJeu(), compte(), et
creeGrille()
joue.c :joue(), pas(), possible(), deplace(), gagne()
undo.c (s’il existe) : push(), pop(), recopie()
chaque protos-XXXX.h : les prototypes de tous les sous-programmes d´efinis dans le fichier
.c correspondant, pr´ec´ed´es de l’inclusion de types.h .
4. Attention ! Chaque .c doit commencer par inclure les .h standards qui lui sont n´ecessaires (et
pas les autres), ainsi que les protos-XXXX.h qui lui sont n´ecessaires (et pas les autres).
5. Compilez s´epar´ement chaque fichier .c (pas les .h !)
Lorsqu’il n’y a plus aucune erreur, faites l’´edition de liens en g´en´erant l’ex´ecutable sokoban3 `a
partir des fichiers *.o . Testez.
3 Automatisation
1. On veut d´esormais modifier quelquechose dans protos-joue.h (modifiez juste le nom d’un para-
m`etre pour essayer).
2. On ne veut pas avoir `a sans cesse retaper la commande de compilation des fichiers concern´es
(lesquels d’ailleurs ?), puis la commande d’´edition de liens. Pour cela ...
3. R´ecup´erez le fichier makefile en suivant le lien ”makefile typique en C” de la section 4 ci-dessous
(par t´el´echargement, pas par copier/coller), et modifiez-le pour l’adapter au pr´esent exercice :
regardez les .c pour savoir quoi ´ecrire dans les d´ependances d’include.
4. Testez la commande make, puis lancez le programme. V´erifiez `a l’´ecran quels sont les modules
recompil´es. Tapez make une seconde fois pour voir le message.
1/3
4 Liens sur la page web de la s´equence 11
makefile typique en C
Appel de C en java
makefile typique Java <>C
´
Echanges de donn´ees Java <>C
5 Fichiers de texte en C
1. ´
Ecrivez un nouveau fichier (fich.c) contenant une fonction chargeGrille() retournant une
Grille correctement allou´ee et initialis´ee `a partir de donn´ees contenues dans un fichier dont le
nom est pass´e en param`etre.
2. Pour cela, cr´eez le fichier niveau01.sok qui devra contenir 12 24 sur la premi`ere ligne puis les
12 chaˆınes de caract`eres d’initialisation.
3. La fonction chargeGrille() tente d’ouvrir le fichier (avec message appropri´e et error(2)), lit
les dimensions (avec message appropri´e et error(2)), creeGrille(), puis pour chaque ligne lue
dans le fichier, recopie les caract`eres dans la Matrice.
4. Modifiez main.c pour remplacer l’initialisation avec matInitiale par
chargeGrille( "niveau01.sok" );
5. Cr´eez le fichier protos-fich.h et incluez-le dans fich.c et main.c .
6. Modifiez le makefile pour ajouter file.o et ses d´ependances. Testez.
6 Appel Java >C
1. En vous reportant fr´equemment aux documents des 3 derniers liens de la section 4 ci-dessus, faites
fonctionner l’exemple d´ecrit dans le lien ”Appel de C en java”, en ex´ecutant toutes les commandes
(en jaune) des paragraphes 1.A `a 1.E ; les fichiers Java et C sont fournis au 1.F. Cela donne-t-il
bien les r´esultats attendus ? Si oui, passez directement au 7, mais essayez de faire l’exercice 6.2
`a 6.6 au cours des 5 prochaines semaines.
2. Dans un autre r´epertoire et en suivant les 5 mˆemes ´etapes qu’`a l’exercice pr´ec´edent, r´ealisez un
programme d´emontrant la possibilit´e d’utiliser en Java les formatages fournis par C (voir exemple
d’ex´ecution au 6.6 ci-dessous). Commencez par compl´eter la classe Java ci-dessous :
// MyFormat.java
public class MyFormat
{ // declaration des 3 sous-programmes C appeles ci-dessous
// (lengthInt, formatInt, et formatInteger)
// qui seront a realiser en C dans le fichier MyFormat.c
static { System.loadLibrary( "MyFormat" ); } // chargera libMyFormat.so
public static void main( String [] args )
{ int len; String s;
len = lengthInt( "[%5d]", 12 ); // nb de caracteres de la String a afficher
System.out.println( "aff1=" + len );
len = lengthInt( "[%04d]", 12 );
System.out.println( "aff2=" + len );
s = formatInt( "[%5d]", 12 ); // String formatee d’un int
System.out.println( "aff3=" + s );
2/3
s = formatInt( "[%04d]", 12 );
System.out.println( "aff4=" + s );
s = formatInteger( "[%5d]", new Integer(12) ); // String formatee d’un Integer
System.out.println( "aff5=" + s );
s = formatInteger( "[%04d]", new Integer(12) );
System.out.println( "aff6=" + s );
} // main()
} // MyFormat
3. Compilez la classe (jusqu’`a ce qu’il n’y ait plus d’erreur) et g´en´erer le .h .
Pour simplifier, il est possible de ne s’occuper que de lengthInt() dans un premier temps.
4. Reprenez le processus utilis´e au 6.1 ci-dessus, et lisez le dernier lien section 2 ci-dessus.
5. ´
Ecrivez le fichier MyFormat.c avec les contraintes suivantes :
Utilisez sprintf() pour les 3 fonctions ; tapez man sprintf pour obtenir de l’aide ou
consultez le poly papier ou en ligne.
Pensez `a convertir une jstring en const char * avant de l’utiliser, et `a rendre la m´emoire
apr`es.
Pensez `a convertir une const char * en jstring avant de la retourner vers Java.
Allouez dynamiquement toute chaˆıne de caract`eres C et lib´erez la m´emoire apr`es.
Acc´edez `a la valeur de l’Integer `a travers sa m´ethode intValue().
6. Ex´ecutez le programme. L’affichage devrait ˆetre :
aff1=7
aff2=6
aff3=[ 12]
aff4=[0012]
aff5=[ 12]
aff6=[0012]
7 Suite du projet Sokoban
1. R´ecup´erez les arguments de la ligne de commande, et s’il y n’y en a bien qu’un seul, utilisez-le
comme nom du fichier d’initialisation (en ajoutant automatiquement l’extension .sok).
2. Lorsqu’on gagne(), ne terminez plus le programme, mais regardez s’il existe un fichier ”de mˆeme
nom + 1” que le fichier initial (niveau02.sok), et continuez le jeu `a ce niveau sup´erieur (et ainsi
de suite ...)
3. Testez aussi votre jeu avec de petites dimensions (5x10) et de plus grandes (15x30).
4. Et pourquoi pas imaginer une interface graphique en Java qui appellerait le moteur de jeu que
vous venez d’´ecrire en C ?
3/3
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !