Menu
Coddy logo textTech

Riepilogo: array generico

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 53 di 61.

challenge icon

Sfida

Facile

Creiamo un contenitore GenericArray: una struttura dati flessibile che può contenere un insieme di interi e stringhe nella stessa raccolta utilizzando puntatori void*.

Organizzerai il codice in tre file:

  • generic_array.h: definisci la struttura GenericArray con tre membri: un array void** per contenere i puntatori, un int per il conteggio attuale e un int per la capacità. Dichiara i prototipi delle funzioni per creare l'array, aggiungere elementi, recuperare elementi tramite indice e liberare l'array.
  • generic_array.c: implementa le funzionalità del contenitore:
    • create_array: alloca un GenericArray con una capacità iniziale specificata e inizializza il conteggio a 0
    • add_element: memorizza un puntatore void* nella posizione disponibile successiva e incrementa il conteggio (supponi che la capacità sia sufficiente)
    • get_element: restituisce il void* all'indice specificato
    • free_array: libera l'array items e la struttura GenericArray stessa
  • main.c: mostra come usare il tuo array generico memorizzando sia interi che stringhe. Leggi il numero di elementi da aggiungere, poi per ogni elemento leggi un indicatore di tipo (i per un intero, s per una stringa) seguito dal valore. Dopo aver aggiunto tutti gli elementi, scorri l'array e stampa ciascun valore. Per gli interi, stampa direttamente il numero. Per le stringhe, stampa direttamente il testo.

Il programma riceverà:

  1. Il numero di elementi da aggiungere
  2. Per ogni elemento: un indicatore di tipo (i o s) seguito dal valore

Quando aggiungi interi, alloca memoria per l'int e memorizza il puntatore. Quando aggiungi stringhe, alloca memoria e copia la stringa. Quando recuperi gli elementi, esegui il cast al tipo appropriato per stamparli.

Importante: per tenere traccia dei tipi da stampare, puoi usare in main un semplice array parallelo di indicatori di tipo, oppure memorizzare il carattere indicatore di tipo insieme a ciascun elemento.

Esempio di output quando gli input sono 3, poi i 42, s Hello, i 100:

42
Hello
100

Esempio di output quando gli input sono 4, poi s World, s Generic, i -5, s Arrays:

World
Generic
-5
Arrays

Ricorda di usare le include guard nel tuo file header. Il contenitore in sé non deve sapere quali tipi memorizza. Contiene semplicemente puntatori void*. La responsabilità di conoscere il tipo ricade sul codice che aggiunge e recupera gli elementi.

Provalo tu

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: Crea un GenericArray con capacità n
    
    // TODO: Crea un array parallelo per tenere traccia dei tipi (array di char di dimensione n)
    
    // TODO: Per ogni elemento:
    // - Leggi l'indicatore del tipo (i o s)
    // - Leggi il valore
    // - Se è un intero: alloca memoria per un int, memorizza il valore e aggiungilo all'array
    // - Se è una stringa: alloca memoria per la stringa, copia il valore e aggiungilo all'array
    // - Memorizza l'indicatore del tipo nell'array parallelo
    
    // TODO: Scorri l'array e stampa ogni elemento
    // - Controlla il tipo nell'array parallelo
    // - Converti void* nel tipo appropriato e stampa il valore
    
    // TODO: Libera tutta la memoria allocata (interi, stringhe e array)
    
    return 0;
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online