MENU

LINKS

INFO

 


Programmazione 19/11/2007

1. Come si scrive C di Roberto

Breve introduzione al linguaggio C

Vorrei solo cominciare ribadendo che la cosa è molto più semplice di quello che possa sembrare, scrivere un programma in C è come scrivere una lettera seguendo tutte le regole della grammatica, ma questo vale per tutti i linguaggi. La grammatica del C, che da ora in poi chiameremo sintassi è molto semplice e composta da poche regole. La prima è che in testa ad ogni programma vanno inserite le direttive al compilatore, alcune possono essere messe anche nel corpo del programma, e tutte sono precedute dal simbolo "#". Vediamo un esempio "#include <p18F2620.h>", serve ad indicare al compilatore che deve essere incluso nel nostro programma il file p18F2620.h. In C questi file chiamati "Heder file" rappresentano una sorta di libreria e contengono la definizione delle funzioni, costanti, definizioni di macro e valori, includendoli nel nostro programma tutto ciò che vi è definito dentro viene automaticamente definito nel nostro programma. Altro esempio di direttiva al compilatore sono le define, la cui sintassi è la seguente: "#define MIA_ETA 30", questa riga indica al compilatore che nel nostro programma ci saranno delle "etichette", in questo esempio l'etichetta è "MIA_ETA" a cui è assegnato il valore 30, in questo modo ogni volta che nel nostro programma scriveremo MIA_ETA in fase di compilazione verrà sostituito con 30. Un'etichetta può contenere informazioni diverse, come un'altra etichetta o anche una macro.
Dopo aver inserito le direttive al compilatore se abbiamo delle funzioni nel nostro programma è il momento di dichiararle, come vedremo in altri esempi ci sono due modi per dichiarare le funzioni, scrivere l'intestazione e tutta la funzione in questo punto del programma o scrivere qui la dichiarazione e poi la funzione completa dopo il corpo del main. Vediamo un esempio di dichiarazione completa di una funzione (i numeri di riga sono stati inseriti solo per facilitare la comprensione):

1: unsigned char somma(unsigned char val_uno, unsigned char val_due, unsigned char val_tre)
2: {
3:    unsigned char totale=vaL_uno+val_due+val_tre;
4:    return totale;
5: }

Questa semplicissima funzione esegue la somma di tre numeri e ritorna il valore calcolato, ma analiziamo tutte le righe cominciando dalla prima. Ogni funzione oltre ad avere un nome, nel nostro caso "somma" avrà un valore di ritorno di tipo "unsigned char" (quello a sinistra di somma), mentre tra parentesi sono indicati tutti i valori che vengono passati alla nostra funzione. Nelle righe 2 e 5 ci sono le parentesi graffe aperte e chiuse, queste delimitano una sezione di programma, nel nostro caso una funzione. Come vedremo in C qualsiasi sezione di programma è sempre raggruppata tra parentesi graffe. La riga 3 contiene la dichiarazione di una variabile (totale), come si può vedere prima si deve indicare il tipo, poi gli viene assegnato il valore della somma dei tre parametri di ingresso, tramite l'operatore "=", per terminare con un punto e virgola. La riga 4 indica che la funzione ritornerà (return) un valore rappresentato dalla variabile totale, notate che anche qui la riga termina con un punto e virgola, in C ogni riga contente istruzioni termina con un punto e virgola, ma in realtà il simbolo ";" non è un terminatore di riga, ma di istruzione. Mettere il codice su più righe è solo una comodità di lettura e buona norma di scrittura di un programma, ma niente può vietarci di scrivere tutto su una riga (essendo lungha potrebbe andare a capo, ma consideratela come una righa sola):

unsigned char somma(unsigned char val_uno, unsigned char val_due, unsigned char val_tre){unsigned char totale=vaL_uno+val_due+val_tre;return totale;}

Per il compilatore la funzione è corretta anche se scritta in questo modo, ma è lampante che per noi andare a rileggere un programma scritto in questo modo risulta invece molto più complicato.
Tra i vari tipi di dato, e qui consiglio la lettura della guida del C18 se non li conoscete, c'è il void, una funzione definita nel seguente modo:

void accendi_led(void);

indica che la funzione "accendi_led" non restituisce nessun valore e non prende nessun valore in ingresso, notate anche che abbiamo appena dichiarato una funzione con la sola intestazione, la differenza sta nel fatto che non c'è il corpo del codice della funzione e che la dichiarazione termina con un punto e virgola.
Concludiamo con la funzione principe del C, ossia la funzione main. Ogni programma deve contenere una funzione main all'interno della quale è contenuto il nostro programma, la funzione main normalmente non restituisce valori, ma può prendere dei parametri di ingresso in alcuni casi, ricordatevi che il programma deve essere contenuto in parentesi graffe. Ed ora un semplice programma completo a scopo esplicativo:

#include <p18F2620.h>
#define MIA_ETA 30

unsigned char somma(unsigned char val_uno, unsigned char val_due, unsigned char val_tre)
{
   unsigned char totale=vaL_uno+val_due+val_tre;
   return totale;
}

void main(void)
{
   unsigned char temperatura=20;
   unsigned char risultato=0;

   risultato=somma(temperatura,MIA_ETA,3);
}

Vediamo un po' se avete capito qualcosa, secondo voi quanto vale alla fine del nostro programma la variabile "risultato"?
Quello che segue è un altro modo per scrivere il nostro programma, stando a quello che abbiamo detto in precedenza.

#include <p18F2620.h>
#define MIA_ETA 30

unsigned char somma(unsigned char val_uno, unsigned char val_due, unsigned char val_tre);

void main(void)
{
   unsigned char temperatura=20;
   unsigned char risultato=0;

   risultato=somma(temperatura,MIA_ETA,3);
}

unsigned char somma(unsigned char val_uno, unsigned char val_due, unsigned char val_tre)
{
   unsigned char totale=vaL_uno+val_due+val_tre;
   return totale;
}

Precedente Indice Successivo


 

NEWS


NEWS


NEWS