IN3A11-2 : Sujet du TP11 - FR

publicité
IN3A11 : Sujet du TP11
-2
Groupe ESIEE, Denis BUREAU, novembre 2007, v1.
1
Les objectifs
Être capable
1. d’utiliser les fichiers de texte en C,
2. de réaliser des programmes composés de modules compilés séparément,
3. d’automatiser la construction de ces programmes,
4. d’appeler du C depuis Java et d’échanger des données.
Et continuer le projet Sokoban.
2
Compilation séparée
1. Créez un nouveau répertoire (tp11?) et recopiez-y une version fonctionnelle de sokoban2.c (au
moins les 3 premières itérations du TP10) en l’appelant main.c .
2. Dupliquez ce fichier en 9 nouveaux fichiers appelés : 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. Éditez 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éfinis dans le fichier
.c correspondant, précédés de l’inclusion de types.h .
4. Attention ! Chaque .c doit commencer par inclure les .h standards qui lui sont nécessaires (et
pas les autres), ainsi que les protos-XXXX.h qui lui sont nécessaires (et pas les autres).
5. Compilez séparément chaque fichier .c (pas les .h !)
Lorsqu’il n’y a plus aucune erreur, faites l’édition de liens en générant l’exécutable sokoban3 à
partir des fichiers *.o . Testez.
3
Automatisation
1. On veut désormais modifier quelquechose dans protos-joue.h (modifiez juste le nom d’un paramètre pour essayer).
2. On ne veut pas avoir à sans cesse retaper la commande de compilation des fichiers concernés
(lesquels d’ailleurs ?), puis la commande d’édition de liens. Pour cela ...
3. Récupérez le fichier makefile en suivant le lien ”makefile typique en C” de la section 4 ci-dessous
(par téléchargement, pas par copier/coller), et modifiez-le pour l’adapter au présent exercice :
regardez les .c pour savoir quoi écrire dans les dépendances d’include.
4. Testez la commande make, puis lancez le programme. Vérifiez à l’écran quels sont les modules
recompilés. Tapez make une seconde fois pour voir le message.
1/3
4
Liens sur la page web de la séquence 11
• makefile typique en C
• Appel de C en java
• makefile typique Java < − > C
• Échanges de données Java < − > C
5
Fichiers de texte en C
1. Écrivez un nouveau fichier (fich.c) contenant une fonction chargeGrille() retournant une
Grille correctement allouée et initialisée à partir de données contenues dans un fichier dont le
nom est passé en paramètre.
2. Pour cela, créez le fichier niveau01.sok qui devra contenir 12 24 sur la première ligne puis les
12 chaı̂nes de caractères d’initialisation.
3. La fonction chargeGrille() tente d’ouvrir le fichier (avec message approprié et error(2)), lit
les dimensions (avec message approprié et error(2)), creeGrille(), puis pour chaque ligne lue
dans le fichier, recopie les caractères dans la Matrice.
4. Modifiez main.c pour remplacer l’initialisation avec matInitiale par
chargeGrille( "niveau01.sok" );
5. Créez 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épendances. Testez.
6
Appel Java − > C
1. En vous reportant fréquemment aux documents des 3 derniers liens de la section 4 ci-dessus, faites
fonctionner l’exemple décrit dans le lien ”Appel de C en java”, en exécutant toutes les commandes
(en jaune) des paragraphes 1.A à 1.E ; les fichiers Java et C sont fournis au 1.F. Cela donne-t-il
bien les résultats attendus ? Si oui, passez directement au 7, mais essayez de faire l’exercice 6.2
à 6.6 au cours des 5 prochaines semaines.
2. Dans un autre répertoire et en suivant les 5 mêmes étapes qu’à l’exercice précédent, réalisez un
programme démontrant la possibilité d’utiliser en Java les formatages fournis par C (voir exemple
d’exécution au 6.6 ci-dessous). Commencez par compléter 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’à ce qu’il n’y ait plus d’erreur) et générer le .h .
Pour simplifier, il est possible de ne s’occuper que de lengthInt() dans un premier temps.
4. Reprenez le processus utilisé au 6.1 ci-dessus, et lisez le dernier lien section 2 ci-dessus.
5. Écrivez 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 à convertir une jstring en const char * avant de l’utiliser, et à rendre la mémoire
après.
• Pensez à convertir une const char * en jstring avant de la retourner vers Java.
• Allouez dynamiquement toute chaı̂ne de caractères C et libérez la mémoire après.
• Accédez à la valeur de l’Integer à travers sa méthode intValue().
6. Exécutez le programme. L’affichage devrait être :
aff1=7
aff2=6
aff3=[
12]
aff4=[0012]
aff5=[
12]
aff6=[0012]
7
Suite du projet Sokoban
1. Récupérez 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ême
nom + 1” que le fichier initial (niveau02.sok), et continuez le jeu à ce niveau supérieur (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’écrire en C ?
3/3
Téléchargement