UFR IMAG Master 2 GICAO Rapport du TP2 d’Outils Informatiques Quentin Pelorson Jules Proust Grenoble, le 25 novembre 2011 Par ces TPs ils nous aient permis d’apprendre à utiliser certains outils, malheureusement la nature (bétise) humaine à permis à certaine personne, sans aucune connaissances sur le hacking, d’avoir accès aux comptes rendu et sources des autres groupes. Vous avez, par la suite, écrit que nous n’évaluerez pas sur la maîtrise des outils mais sur nos comportements face aux problèmes rencontrés. Le notre est simple : face aux voleurs, nous rendons tout gratuit Question 1-4-8 Code fichier SWIG % module tp3 %{ # include " tp3 . h " %} const double PI ; double pi () ; double add_pi ( double v ) ; void set_log ( int v ) ; void stats () ; typedef struct _vecteur Vecteur ; Vecteur * Vecteur_create ( double a , double b , double c ) ; Vecteur * Vecteur_add ( Vecteur * v1 , Vecteur * v2 ) ; double Vecteur_elem ( Vecteur *v , int coord ) ; char * Vecteur_str ( Vecteur * v ) ; void Vecteur_destroy ( Vecteur * v ) ; typedef Vecteur { } Vecteur ; % extend Vecteur { Vecteur ( double a , double b , double c ) { return Vecteur_create (a ,b , c ) ; } ~ Vecteur () { Vecteur_destroy ( $self ) ; } } Dans ce fichier SWIG, on peut observer trois différentes parties. La partie 2 inclue entre La partie incluant différentes fonctions est destiné à python, cette partie lui spécifie quelle fonction il peut appeler. La dernière partie est aussi pour python mais permet une "jolie syntaxe" et de "jolies liaisons" lors de l’appelle du type Vecteur. Il n’y a pour l’instant qu’un destructeur et un créateur mais il esst possible d’y ajouter toutes les fonctions que vous souhaitez ! Question 2 Nous n’avons eu à faire "que" le CMakeLists du folder "python". Ce CMakeLists comprend un output d’un fichier .c à partir d’un fichier .py ainsi que l’appelle à SWIG pour construire le modue nécessaire au TP. CMakeLists du folder python find_package ( SWIG ) Include ( UseSWIG ) add_custom_command ( OUTPUT $ { PROJECT_SOURCE_DIR }/ python / tp3_wrap . c COMMAND $ { SWIG_EXECUTABLE } ARGS - python $ { PROJECT_SOURCE_DIR }/ python / tp3 . i ) SWIG_ADD_MODULE ( tp3 python $ { PROJECT_SOURCE_DIR }/ python / tp3_wrap . c $ { PROJECT_SOURCE_DIR }/ lib / tp3 . c ) Mais des erreurs parvenus nous ramenèrent à la réalité il a aussi fallut modifier le CMakeLists principal qui utilisait le compilateur gcc. CMakeLists principal cmake_minimum_required ( VERSION 2.6) project ( TP3 ) set ( CMAKE_C_FLAGS " -g - Wall " ) include_directories ( $ { TP3_SOURCE_DIR }/ lib ) include_directories ( $ { TP3_SOURCE_DIR }/ python ) include_directories (/ usr / include / python2 .7) 3 add_subdirectory ( lib ) add_subdirectory ( examples ) add_subdirectory ( python ) Question 3 Afin d’éxécuter les mêmes commandes que les test1.c il nous faut appeler le module tp3 créer par SWIG et demander l’accès aux fonctions qu’il contient. Pour simplifier l’appel à plusieurs fonctions, il est possible d’écrire une macro permettant d’appeler une suite de fonctions. test1.py import tp3 def part1 () : print " PI = " , tp3 . PI print " pi () = " , tp3 . pi () print " pi +5 = " , tp3 . add_pi (5) tp3 . stats () part1 () tp3 . set_log (1) part1 () tp3 . set_log (0) tp3 . stats () Question 5 Le test2.py éxécute les mêmes commandes que le fichier test2.c grâce au wrapp des autres fonctions contenues dans le fichier tp3.h. test2.py import tp3 def f () : v1 = tp3 . Vecteur_create (1 , 2 , 3) v2 = tp3 . Vecteur_create (4 , 5 , 6) v = tp3 . Vecteur_add ( v1 , v2 ) tp3 . stats () 4 val_v = tp3 . Vecteur_str ( v ) print " Vecteur v : " , val_v tp3 . Vecteur_destroy ( v2 ) tp3 . Vecteur_destroy ( v1 ) tp3 . Vecteur_destroy ( v ) return v tp3 . stats () vecteur = f () tp3 . stats () val_v = tp3 . Vecteur_str ( vecteur ) # tp3 . free ( val_v ) Nous pouvons alors observer que la construction et la destructions des vecteurs construit est bien éxécutée. Sortie console Nombre de Vecteur crees : 0 Nombre de Vecteur detruits : 0 Nombre de Vecteur crees : 3 Nombre de Vecteur detruits : 0 Vecteur v : [5 ,7 ,9] Nombre de Vecteur cres : 3 Nombre de Vecteur detruits : 3 Question 6 OOOOooooohhhh la "jolie syntaxe" "jolie syntaxe" import tp3 v = Vecteur (3 ,4 ,0) del v Question 7 Les sections 5.5.1-7 peuvent vous aider à comprendre comment réaliser des structures permettant de faire de "jolis" appels dans python. Les sections 5 6.17-18 donnent des informations complémentaires pour construire de "jolies" choses. 6