Rappel : tableaux génériques
Fait partie de la section Object Oriented Programming 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 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 structureGenericArrayavec trois membres : un tableauvoid**pour contenir les pointeurs, unintpour le décompte actuel, et unintpour 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 à 0add_element— stocke un pointeurvoid*dans le prochain emplacement disponible et incrémente le décompte (supposez que la capacité est suffisante)get_element— retourne levoid*à 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 (ipour entier,spour 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 :
- 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'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
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 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
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 cercle