Menu
Coddy logo textTech

Rappel : tableaux génériques

Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 53 sur 61.

challenge icon

Défi

Facile

Construisons un conteneur GenericArray : une structure de données flexible capable de contenir un mélange d'entiers et de chaînes dans la même collection à l'aide de pointeurs void*.

Vous organiserez votre code sur trois fichiers :

  • generic_array.h : définissez la structure GenericArray avec trois membres : un tableau void** destiné à contenir des pointeurs, un int pour le nombre actuel d'éléments et un int pour la capacité. Déclarez les prototypes des fonctions permettant de créer le tableau, d'ajouter des éléments, de récupérer des éléments par indice et de libérer le tableau.
  • generic_array.c : implémentez les fonctionnalités de votre conteneur :
    • create_array : alloue un GenericArray avec une capacité initiale donnée et initialise le nombre d'éléments à 0
    • add_element : stocke un pointeur void* dans le prochain emplacement disponible et incrémente le nombre d'éléments (supposez que la capacité est suffisante)
    • get_element : renvoie le void* à l'indice spécifié
    • free_array : libère le tableau d'éléments ainsi que la structure GenericArray elle-même
  • main.c : démontrez votre tableau générique en stockant à la fois des entiers et des chaînes. Lisez le nombre d'éléments à ajouter, puis, pour chaque élément, lisez un indicateur de type (i pour un entier, s pour une chaîne) suivi de la valeur. Après avoir ajouté tous les éléments, parcourez le tableau et affichez chaque valeur. Pour les entiers, affichez directement le nombre. Pour les chaînes, affichez directement le texte.

Votre programme recevra :

  1. Le nombre d'éléments à ajouter
  2. Pour chaque élément : un indicateur de type (i ou s) suivi de la valeur

Lors de l'ajout d'entiers, allouez de la mémoire pour l'int et stockez le pointeur. Lors de l'ajout de chaînes, allouez de la mémoire et copiez la chaîne. Lors de la récupération, effectuez une conversion vers le type approprié pour l'afficher.

Important : pour suivre les types lors de l'affichage, vous pouvez utiliser dans main un simple tableau parallèle d'indicateurs de type, ou stocker le caractère indicateur de type à côté de chaque élément.

Exemple de sortie lorsque les entrées sont 3, puis i 42, s Hello, i 100 :

42
Hello
100

Exemple de sortie lorsque les entrées sont 4, puis s World, s Generic, i -5, s Arrays :

World
Generic
-5
Arrays

N'oubliez pas d'utiliser des protections contre les inclusions multiples dans votre fichier d'en-tête. Le conteneur lui-même n'a pas besoin de savoir quels types il stocke. Il contient simplement des pointeurs void*. La responsabilité de connaître le type revient au code qui ajoute et récupère les éléments.

Essayez vous-même

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: Créer un GenericArray avec une capacité n
    
    // TODO: Créer un tableau parallèle pour suivre les types (tableau de char de taille n)
    
    // TODO: Pour chaque élément :
    // - Lire l'indicateur de type (i ou s)
    // - Lire la valeur
    // - Si entier : allouer de la mémoire pour int, stocker la valeur, ajouter au tableau
    // - Si chaîne : allouer de la mémoire pour la chaîne, copier la valeur, ajouter au tableau
    // - Stocker l'indicateur de type dans votre tableau parallèle
    
    // TODO: Parcourir le tableau et afficher chaque élément
    // - Vérifier le type depuis votre tableau parallèle
    // - Caster le void* vers le type approprié et afficher
    
    // TODO: Libérer toute la mémoire allouée (entiers, chaînes et le tableau)
    
    return 0;
}

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur C en ligne