Menu
Coddy logo textTech

Rappel : tableaux génériques

Fait partie de la section Object Oriented Programming 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 de caractères dans la même collection en utilisant des pointeurs void*.

Vous organiserez votre code sur trois fichiers :

  • generic_array.h : Définissez la structure GenericArray avec trois membres : un tableau void** pour contenir les pointeurs, un int pour le décompte actuel, et un int pour la capacité. Déclarez les prototypes de fonctions pour créer le tableau, ajouter des éléments, récupérer des éléments par index et 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 décompte à 0
    • add_element — stocke un pointeur void* dans le prochain emplacement disponible et incrémente le décompte (supposez que la capacité est suffisante)
    • get_element — retourne le void* à l'index spécifié
    • free_array — libère le tableau d'éléments et 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 de caractères. Lisez le nombre d'éléments à ajouter, puis pour chaque élément, lisez un indicateur de type (i pour entier, s pour 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 le nombre directement. Pour les chaînes, affichez le texte directement.

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'entier 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 un transtypage (cast) vers le type approprié pour l'affichage.

Important : Pour suivre les types lors de l'affichage, vous pouvez utiliser un simple tableau parallèle d'indicateurs de type dans le main, 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 gardes d'inclusion 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 incombe 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 un 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 à partir de votre tableau parallèle
    // - Convertir (cast) 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 Object Oriented Programming