Rappel : tableaux génériques
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 53 sur 61.
Défi
FacileConstruisons 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 structureGenericArrayavec trois membres : un tableauvoid**destiné à contenir des pointeurs, unintpour le nombre actuel d'éléments et unintpour 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 à 0add_element: stocke un pointeurvoid*dans le prochain emplacement disponible et incrémente le nombre d'éléments (supposez que la capacité est suffisante)get_element: renvoie levoid*à 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 (ipour un entier,spour 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 :
- Le nombre d'éléments à ajouter
- Pour chaque élément : un indicateur de type (
ious) 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
100Exemple de sortie lorsque les entrées sont 4, puis s World, s Generic, i -5, s Arrays :
World
Generic
-5
ArraysN'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
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète7Pointeurs sur fonctions
Déclaration de pointeurs sur fonctionsAppel de pointeurs sur fonctionsTypedef pour les pointeurs sur fonctionsPassage de fonctions en argumentsRécapitulatif : Dispatcher de calculatrice10Conteneurs génériques
Rappel sur les pointeurs voidWrapper génériqueÉchange génériqueComparaison génériqueRappel : tableaux génériques2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne