In questa seconda puntata del corso avanzato sul linguaggio C, con il Raspberry Pi, studieremo un tipo di dati molto particolare, la struttura. Essa è una sorta di contenitore al cui interno si possono memorizzare tipologie di dati più semplici. Vedremo, con tanti esempi, dove le strutture possono essere collocate e utilizzate. Inoltre, la puntata è propedeutica allo studio di successive lezioni del corso, nelle quali si affronteranno argomentazioni che prevederanno, proprio, l'utilizzo delle strutture.
Introduzione
Si tratta di un insieme di variabili, anche di diverso tipo, raggruppate logicamente in una sola unità. Possiamo paragonarle, seppur lontanamente, al record dei database o del linguaggio Pascal. Esse sono considerate dei dati aggregati, in quanto risultano composte da dati anche eterogenei tra loro. Per esempio un dato cliente è caratterizzato da un cognome, da un nome, da un numero di telefono, ecc. Molti testi sul linguaggio C sono inizialmente poco chiari o troppo complessi, su tale argomento e spesso il neofita è sommerso da una grande confusione, in merito. Cercheremo, in questa sede, di fornire tanti esempi, passo dopo passo, per far comprendere alla perfezione il concetto delle strutture. Si consiglia vivamente di provare tutti gli esempi e i listati riportati di seguito, al fine di entrare nell'ottica delle varianti e delle modifiche del codice proposto. Iniziamo con un semplice esempio: si vogliono memorizzare, di alcune persone che intendono seguire una dieta, le seguenti informazioni:
- Età;
- Peso;
- Altezza;
- Circonferenza vita;
- Circonferenza fianchi.
Un programma generico potrebbe normalmente gestire i dati in questo modo:
#include <stdio.h> int main() { int Eta; int Peso; int Altezza; int Vita; int Fianchi; printf("Dimensione Eta: %d\n",sizeof(Eta)); printf("Dimensione Peso: %d\n",sizeof(Peso)); printf("Dimensione Altezza: %d\n",sizeof(Altezza)); printf("Dimensione Vita: %d\n",sizeof(Vita)); printf("Dimensione Fianchi: %d\n",sizeof(Fianchi)); return 0; }
Prestando sempre attenzione alla differenza tra maiuscole e minuscole, in questo listato abbiamo dichiarato cinque variabili di tipo intero: Eta, Peso, Altezza, Vita e Fianchi. La funzione sizeof visualizza le rispettive occupazioni di spazio in memoria, in numero di bytes. Ogni variabile, in questo caso, è allocata in 4 byte della RAM (vedi esecuzione di cui alla figura 1). Si tratta di una gestione ben funzionante, ma ogni variabile è indipendente e non ha nulla a che fare con tutte le altre. Benché si riferiscano tutte ad una stessa persona, i contenitori sono "slegati" tra di loro.
Per questa tipologia di informazioni, sarebbe utile gestire tali dati in forma strutturata e ben organizzata. Le strutture, appunto ci danno una valida mano d'aiuto per organizzare al meglio i nostri dati e le nostre informazioni in memoria.
La Struttura
Per definire una struttura, quale insieme di variabili raggruppate sotto unica gerarchia, è necessario utilizzare la parola chiave struct, come mostrato nel seguente listato:
#include <stdio.h> int main() { struct Scheda { int Eta; int Peso; int Altezza; int Vita; int Fianchi; }; return 0; }
Con questo esempio abbiamo creato un prototipo di struttura, uno schema di dati, ancora teorico, non esistente e provvisorio, dal nome "Scheda" (il tag della struttura). Esso è "predisposto" a contenere le cinque variabili intere. Attenzione: con tale listato non abbiamo assegnato alcuno spazio in memoria RAM ai dati, abbiamo solo informato il compilatore di tale futura ed eventuale strutturazione. Ricordate di terminare la dichiarazione di struttura con il punto e virgola finale, pena un messaggio di errore di difficile interpretazione e correzione. Per mettere in pratica, invece, l'applicazione e concretizzare un vero e proprio utilizzo delle stesse, è necessario affidarsi al seguente programma di completamento. Le parti più significative del codice sono formattate in grassetto.
#include <stdio.h> int main() { struct Scheda { int Eta; int Peso; int Altezza; int Vita; int Fianchi; }; /*---Dichiara due strutture, Donna e Uomo, basate sullo base dello schema di Scheda---*/ struct Scheda Donna,Uomo; printf("Dimensione Struttura Donna: %d\n",sizeof(Donna)); printf("Dimensione Struttura Uomo: %d\n",sizeof(Uomo)); return 0; }
Questa volta, eseguendo il programma di cui sopra, la funzione "sizeof" restituisce la misura di 20 byte, confermando e visualizzando l'intera occupazione in memoria delle due strutture Donna e Uomo, come mostrato in figura 2.
La figura 3 chiarisce, invece, cosa avviene in memoria RAM, dopo la dichiarazione [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2575 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Grazie per l’articolo.
Lo studio del linguaggio C è sicuramente una spesa di tempo molto utile che può portare solo vantaggi a noi stessi in qualsiasi applicazione, non solo per raspberry.
Conoscendo già le basi di C ho divorato l’articolo e trovato al volo l’errore nell’esercio finale.
Bravissimo Andrea.
Il linguaggio C da’ quella formazione ligica e intellettuale che apre, poi, il cervello ad apprendere qualsiasi altro linguaggio di programmazione (tranne, ovviamente, LISP, Prolog, ecc).
Come ho detto… chi trova gli errori in un programma si può considerare un ottimo programmatore.