Exercice : Mise en place

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.

  1. 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

  2. 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

  3. 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

  4. 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