Travaux pratiques : Programmation en C

Fichiers fournis pour ces travaux pratiques : matrix.h, main_matrix.c, Makefile, test.c, test_matrix.c, utest.h.

Matrices

Le but de ces travaux pratiques est de programmer en C en implémentant minimalement une structure de données matrix permettant de stocker des matrices de nombres (des double). On considère le code suivant d'un programme main_matrix.

#include <stdlib.h>

#include "matrix.h"

int main(void)
{
  // We consider matrix of double's

  // Create an identity matrix of size 3×3
  matrix m = matrix_identity(3);

  // Create a 3×3 matrix full of 1.'s
  matrix n = matrix_create(3, 3, 1.);

  // Put 42. in the first cell of the matrix n
  *matrix_get(n, 0, 0)=42.;

  // Create the matrix r, addition of matrices m and n
  matrix r = matrix_add(m, n);

  // Display the matrix r
  matrix_print(stdout, r);
  /* The result should be:
   *  43.00   1.00   1.00
       1.00   2.00   1.00
       1.00   1.00   2.00 */

  // Free the memory allocated for all three matrices
  matrix_destroy(m);
  matrix_destroy(n);
  matrix_destroy(r);

  return EXIT_SUCCESS;
}
  1. Créer l'en-tête matrix.h contenant la définition du type matrix et la déclaration des fonctions utilisées par le programme.
  2. Implémenter ces fonctions dans un fichier matrix.c
  3. Écrire un Makefile aussi propre que possible permettant de compiler ces différents fichiers et de tester le programme main_matrix. Utiliser gdb pour déboguer votre programme.
  4. Changer le Makefile pour construire une bibliothèque dynamique libmatrix.so et une bibliothèque statique libmatrix.a contenant les fonctions de matrix.c, et pour compiler le programme print_matrix en utilisant l'une ou l'autre de ces deux bibliothèques. Tester.
  5. Utiliser ldd, nm -D sur les versions dynamique et statique de votre programme.
  6. Tester votre programme avec valgrind et efence.
  7. Utiliser le framework utest.h pour ajouter des tests unitaires à votre programme, en vous familiarisant au préalable avec son usage.
  8. Ajouter des fonctionnalités, en ajoutant systématiquement des tests unitaires pour les tester:

Installation d'un logiciel

  1. Choisir un logiciel utilisant les GNU autotools (p. ex., la version libre de John the Ripper), configurer, compiler, installer et tester sur votre machine sans utiliser de droits de superutilisateur.