Repaso: Array genérico
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 53 de 61.
Desafío
FácilVamos a construir un contenedor GenericArray — una estructura de datos flexible que puede contener una mezcla de enteros y cadenas en la misma colección utilizando punteros void*.
Organizarás tu código en tres archivos:
generic_array.h: Define la estructuraGenericArraycon tres miembros: un arreglovoid**para contener punteros, unintpara el conteo actual y unintpara la capacidad. Declara los prototipos de las funciones para crear el arreglo, añadir elementos, recuperar elementos por índice y liberar el arreglo.generic_array.c: Implementa la funcionalidad de tu contenedor:create_array— asigna un GenericArray con una capacidad inicial dada e inicializa el conteo a 0add_element— almacena un punterovoid*en el siguiente espacio disponible e incrementa el conteo (asume que la capacidad es suficiente)get_element— devuelve elvoid*en el índice especificadofree_array— libera el arreglo de elementos y la propia estructura GenericArray
main.c: Demuestra tu arreglo genérico almacenando tanto enteros como cadenas. Lee el número de elementos a añadir, luego, para cada elemento, lee un indicador de tipo (ipara entero,spara cadena) seguido del valor. Después de añadir todos los elementos, itera a través del arreglo e imprime cada valor. Para los enteros, imprime el número directamente. Para las cadenas, imprime el texto directamente.
Tu programa recibirá:
- El número de elementos a añadir
- Para cada elemento: un indicador de tipo (
ios) seguido del valor
Al añadir enteros, asigna memoria para el int y almacena el puntero. Al añadir cadenas, asigna memoria y copia la cadena. Al recuperar, realiza un cast de vuelta al tipo apropiado para imprimir.
Importante: Para rastrear los tipos para la impresión, puedes usar un arreglo paralelo simple de indicadores de tipo en main, o almacenar el carácter indicador de tipo junto a cada elemento.
Ejemplo de salida cuando las entradas son 3, luego i 42, s Hello, i 100:
42
Hello
100Ejemplo de salida cuando las entradas son 4, luego s World, s Generic, i -5, s Arrays:
World
Generic
-5
ArraysRecuerda usar guardas de inclusión en tu archivo de cabecera. El contenedor en sí no necesita saber qué tipos almacena — simplemente guarda punteros void*. La responsabilidad de conocer el tipo recae en el código que añade y recupera los elementos.
Pruébalo tú mismo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"
int main() {
int n;
scanf("%d", &n);
// TODO: Crear un GenericArray con capacidad n
// TODO: Crear un arreglo paralelo para rastrear los tipos (arreglo de char de tamaño n)
// TODO: Para cada elemento:
// - Leer el indicador de tipo (i o s)
// - Leer el valor
// - Si es entero: asignar memoria para int, almacenar el valor, añadir al arreglo
// - Si es cadena: asignar memoria para la cadena, copiar el valor, añadir al arreglo
// - Almacenar el indicador de tipo en tu arreglo paralelo
// TODO: Iterar a través del arreglo e imprimir cada elemento
// - Verificar el tipo desde tu arreglo paralelo
// - Convertir el void* de nuevo al tipo apropiado e imprimir
// TODO: Liberar toda la memoria asignada (enteros, cadenas y el arreglo)
return 0;
}
Todas las lecciones de Object Oriented Programming
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculo