Riepilogo: array generico
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 53 di 61.
Sfida
FacileCreiamo 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 strutturaGenericArraycon tre membri: un arrayvoid**per contenere i puntatori, unintper il conteggio attuale e unintper 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 0add_element: memorizza un puntatorevoid*nella posizione disponibile successiva e incrementa il conteggio (supponi che la capacità sia sufficiente)get_element: restituisce ilvoid*all'indice specificatofree_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 (iper un intero,sper 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à:
- Il numero di elementi da aggiungere
- Per ogni elemento: un indicatore di tipo (
ios) 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
100Esempio di output quando gli input sono 4, poi s World, s Generic, i -5, s Arrays:
World
Generic
-5
ArraysRicorda 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
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta7Puntatori a funzione
Dichiarare puntatori a funzioneChiamare i puntatori a funzioneTypedef per puntatori a funzionePassare funzioni come argomentiRiepilogo: dispatch della calcolatrice10Contenitori generici
Riepilogo dei puntatori voidWrapper genericoScambio genericoConfronto genericoRiepilogo: array generico2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online