Exercice : Mise en place#
Dans ce TP, vous allez progressivement définir – dans un fichier
vecteur.cpp
– une structure de données pour des tableaux dynamiques
d’entiers, ainsi que les fonctions permettant de les utiliser.
Dans ce premier exercice, vous implémenterez les éléments de base
nécessaires à la création, l’affichage et la libération d’un
tableau. Vous n’aurez pas encore tous les éléments requis pour écrire
des tests, mais, vous ferez à chaque étape une première vérification
de votre code en compilant le fichier vecteur.cpp
.
Définissez la structure de données nécessaire à la gestion d’un tableau dynamique.
BEGIN SOLUTION
struct vecteur { int *data; // pointeur vers les éléments du tableau int count; // nombre d'éléments présents dans le tableau int size; // place mémoire réservée pour le tableau // (exprimée en nb d'éléments) };
END SOLUTION
Définissez une fonction permettant de créer un tableau dynamique vide. Attention de bien initialiser tout ce qui doit l’être.
vecteur *creer_vecteur();
BEGIN SOLUTION
On choisit ici la solution simple qui consiste à ne pas pré-allouer le tableau. Une autre solution serait d’allouer dès la création un petit tableau par exemple de 8 éléments.
vecteur *creer_vecteur() { vecteur *v = (vecteur *)malloc(sizeof(vecteur)); v->data = NULL; v->count = 0; v->size = 0; return v; }
END SOLUTION
Définissez une fonction qui affiche simplement un tableau dynamique. Cette fonction vous sera particulièrement utile pour les tests de vos fonctions ensuite.
void afficher_vecteur(vecteur *v);
BEGIN SOLUTION
void afficher_vecteur(vecteur *v) { for (int i = 0; i < v->count; i++) { std::cout << v->data[i] << " "; } std::cout << std::endl; }
END SOLUTION
Afin de gérer correctement la mémoire, définissez une fonction pour libérer la mémoire occupée par un tableau.
void liberer_vecteur(vecteur *v);
BEGIN SOLUTION
Le test n’est ici pas vraiment nécessaire puisque la fonction free ne fait rien si on lui donne un pointeur NULL. Il permet toutefois d’exprimmer le fait que data peut-être NULL et que ce cas est géré correctement.
void liberer_vecteur(vecteur *v) { if (v->data != NULL) { free(v->data); } free(v); }
END SOLUTION