Corso C avanzato su Raspberry PI: Le strutture

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.

Figura 1: L'occupazione delle cinque variabili intere, in RAM.

Figura 1: L'occupazione delle cinque variabili intere, in RAM.

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.

Figura 2: L'occupazione in RAM delle due strutture Uomo e Donna.

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 MAKER. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici MAKER e potrai fare il download (PDF) dell'EOS-Book del mese. ABBONATI ORA, è semplice e sicuro.

Abbonati alle riviste di elettronica

2 Commenti

  1. Andrea Salvatori IU6FZL Andrea Salvatori IU6FZL 31 luglio 2018
    • Giovanni Di Maria Giovanni Di Maria 1 agosto 2018

Scrivi un commento

EOS-Academy