Menu
Coddy logo textTech

Sistema di eventi

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

challenge icon

Sfida

Facile

Costruiamo un sistema di notifiche: un’architettura basata sugli eventi in cui più gestori possono iscriversi a un evento e rispondere quando viene attivato. Questo modello è alla base della programmazione reattiva e dei framework per GUI.

Organizzerai il codice in tre file:

  • event.h: definisci il tipo puntatore a funzione Handler, che accetta un messaggio const char*. Crea una struttura Event che contenga un array con un massimo di 5 gestori e il numero di gestori registrati. Dichiara le funzioni per inizializzare un evento, iscrivere un gestore e attivare l’evento per notificare tutti gli iscritti.
  • event.c: implementa il tuo sistema di eventi:
    • init_event: accetta un puntatore a Event e imposta a 0 il numero di gestori
    • subscribe: accetta un puntatore a Event e un Handler, aggiunge il gestore all’array se c’è spazio (numero inferiore a 5) e incrementa il numero
    • fire: accetta un puntatore a Event e una stringa di messaggio, quindi chiama ogni gestore registrato passandogli quel messaggio, nell’ordine in cui si sono iscritti
  • main.c: crea tre diverse funzioni gestore che rispondono agli eventi in modi distinti:
    • logger: stampa [LOG] seguito dal messaggio
    • alert: stampa [ALERT] seguito dal messaggio
    • counter: usa una variabile statica per contare quante volte è stata chiamata, quindi stampa [COUNT] X, dove X è il conteggio attuale
    Leggi un intero che indica quanti gestori iscrivere (1, 2 o 3). Iscrivi quel numero di gestori nell’ordine seguente: prima logger, poi alert (se sono almeno 2), quindi counter (se sono 3). Leggi una stringa di messaggio, quindi attiva l’evento con quel messaggio.

Il programma riceverà:

  1. Il numero di gestori da iscrivere (1, 2 o 3)
  2. Il messaggio da trasmettere

Esempio di output quando gli input sono 3 e System started:

[LOG] System started
[ALERT] System started
[COUNT] 1

Esempio di output quando gli input sono 2 e Warning detected:

[LOG] Warning detected
[ALERT] Warning detected

Esempio di output quando gli input sono 1 e Hello:

[LOG] Hello

Questo mostra il polimorfismo tramite puntatori a funzione: la stessa chiamata a fire attiva comportamenti completamente diversi, a seconda dei gestori iscritti. Ogni gestore risponde a modo suo allo stesso evento, illustrando la natura disaccoppiata della progettazione basata sugli eventi.

Provalo tu

#include <stdio.h>
#include <string.h>
#include "event.h"

// TODO: Implementare il gestore logger
// Stampa "[LOG] " seguito dal messaggio
void logger(const char* message) {
    // TODO: Implementare
}

// TODO: Implementare il gestore alert
// Stampa "[ALERT] " seguito dal messaggio
void alert(const char* message) {
    // TODO: Implementare
}

// TODO: Implementare il gestore counter
// Usa una variabile statica per contare le chiamate
// Stampa "[COUNT] X", dove X è il conteggio corrente
void counter(const char* message) {
    // TODO: Implementare con una variabile statica
}

int main() {
    // Leggi il numero di gestori da sottoscrivere
    int num_handlers;
    scanf("%d", &num_handlers);
    getchar(); // consuma il carattere di nuova riga
    
    // Leggi il messaggio
    char message[256];
    fgets(message, sizeof(message), stdin);
    message[strcspn(message, "\n")] = '\0'; // rimuovi il carattere di nuova riga
    
    // TODO: Crea e inizializza un Event
    
    // TODO: Registra gli handler in base a num_handlers
    // 1 handler: logger
    // 2 handler: logger, alert
    // 3 handler: logger, alert, counter
    
    // TODO: Attiva l'evento con il messaggio
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online