Revisão: Array Genérico
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 53 de 61.
Desafio
FácilVamos construir um contêiner GenericArray — uma estrutura de dados flexível que pode conter uma mistura de inteiros e strings na mesma coleção usando ponteiros void*.
Você organizará seu código em três arquivos:
generic_array.h: Defina a structGenericArraycom três membros: um arrayvoid**para conter ponteiros, umintpara a contagem atual e umintpara a capacidade. Declare os protótipos das funções para criar o array, adicionar elementos, recuperar elementos por índice e liberar o array.generic_array.c: Implemente a funcionalidade do seu contêiner:create_array— aloca um GenericArray com uma capacidade inicial fornecida e inicializa a contagem como 0add_element— armazena um ponteirovoid*no próximo slot disponível e incrementa a contagem (assuma que a capacidade é suficiente)get_element— retorna ovoid*no índice especificadofree_array— libera o array de itens e a própria struct GenericArray
main.c: Demonstre seu array genérico armazenando tanto inteiros quanto strings. Leia o número de elementos a serem adicionados, então, para cada elemento, leia um indicador de tipo (ipara inteiro,spara string) seguido pelo valor. Após adicionar todos os elementos, itere pelo array e imprima cada valor. Para inteiros, imprima o número diretamente. Para strings, imprima o texto diretamente.
Seu programa receberá:
- O número de elementos a serem adicionados
- Para cada elemento: um indicador de tipo (
ious) seguido pelo valor
Ao adicionar inteiros, aloque memória para o int e armazene o ponteiro. Ao adicionar strings, aloque memória e copie a string. Ao recuperar, faça o cast de volta para o tipo apropriado para imprimir.
Importante: Para rastrear os tipos para impressão, você pode usar um array paralelo simples de indicadores de tipo na main, ou armazenar o caractere indicador de tipo junto com cada elemento.
Exemplo de saída quando as entradas são 3, depois i 42, s Hello, i 100:
42
Hello
100Exemplo de saída quando as entradas são 4, depois s World, s Generic, i -5, s Arrays:
World
Generic
-5
ArraysLembre-se de usar guards de inclusão (include guards) em seu arquivo de cabeçalho. O contêiner em si não precisa saber quais tipos ele armazena — ele apenas guarda ponteiros void*. A responsabilidade de saber o tipo recai sobre o código que adiciona e recupera os elementos.
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"
int main() {
int n;
scanf("%d", &n);
// TODO: Criar um GenericArray com capacidade n
// TODO: Criar um array paralelo para rastrear os tipos (array de char de tamanho n)
// TODO: Para cada elemento:
// - Ler o indicador de tipo (i ou s)
// - Ler o valor
// - Se for inteiro: alocar memória para int, armazenar o valor, adicionar ao array
// - Se for string: alocar memória para string, copiar o valor, adicionar ao array
// - Armazenar o indicador de tipo no seu array paralelo
// TODO: Iterar pelo array e imprimir cada elemento
// - Verificar o tipo a partir do seu array paralelo
// - Fazer o cast do void* de volta para o tipo apropriado e imprimir
// TODO: Liberar toda a memória alocada (inteiros, strings e o array)
return 0;
}
Todas as lições de Object Oriented Programming
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta7Ponteiros para Funções
Declarando Ponteiros para FunçõesChamando Ponteiros para FunçõesTypedef para Ponteiros para FunçõesPassando Funções como ArgumentosRecapitulação: Dispatch de Calculadora10Contêineres Genéricos
Revisão de Ponteiros VoidWrapper GenéricoTroca GenéricaComparação GenéricaRevisão: Array Genérico2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do Círculo