Feb 29

I registri sono i componenti circuitali che consentono un accesso molto rapido ma possono memorizzare, al loro interno, un numero limitato di byte (in genere 1, 2, 4 o 8).

Dal punto di vista del funzionamento i registri possono essere suddivisi in due grandi categorie:
- registri in parallelo, in cui tutti i bit che formano il dato vengono memorizzati contemporaneamente e in cui la registrazione di un dato viene effettuata in due fasi: l’azzeramento di tutti i bit del registro, ed un secondo ciclo in cui vengono commutati tutti i bit che devono assumere il valore 1;
- registri a scorrimento, in cui i bit che compongono il dato vengono memorizzati in modo sequenziale con la seguente modalità: ad ogni impulso di clock il contenuto dell’i-esimo bistabile (flip-flop) viene trasferito in quello di posto i+1 e nel bistabile di posto 1 viene registrato il valore del nuovo bit da memorizzare.

Feb 28

Come abbiamo detto in un precedente articolo, quando si vuole articolare un programma su più file sorgenti è indispensabile coordinare le dichiarazioni delle variabili per evitare errori di interpretazione da parte del compilatore e del linker.

Per questo il C++ rende possibile al programmatore di definire per le variabili, diverse classi di memorizzazione, che hanno significato diverso a seconda che le variabili siano definite all’esterno delle funzioni o all’interno di esse.

La Dichiarazione delle Variabili a Livello Esterno

Durante lo sviluppo di un programma articolato su più file, il responsabile di un modulo può trovarsi, nel definire una variabile globale, di fronte a tre casi:

- la variabile ha significato, e quindi deve essere visibile, solo al’interno delle funzioni che appartengono a quel modulo e quindi si vuole evitare che venga in conflitto con altre variabili con lo stesso nome, definite su altri file sorgenti.
La variabile deve quindi essere dichiarata all’inizio del file sorgente e deve essere fatta precedere dallo specificatore static, per renderla visibile solo nel file in cui è stata dichiarata.
Se nella definizione della variabile non viene specificato il valore iniziale, questo viene posto automaticamente a zero.
Nella situazione che segue, per esempio,

file 1
static int x=5;
main()
{corpo del main
}

file 2
static int x=2;
void int Funz1()
{corpo di Funz1
}
void Funz2()
{corpo di Funz2
}

Le due variabili x, pur essendo entrambe globali, vengono considerate come due entità distinte a ciascuna delle quali si può accedere all’interno del file in cui è stata dichiarata: alla prima si può accedere solo dall’interno della funzione main(), mentre la seconda è visibile dalle due funzioni Funz1 e Funz2, ma non dal main().

- La variabile ha significato globale e dovrà essere utilizzata anche in altri moduli: viene dichiarata nel modo solito.
Per esempio, nella situazione seguente:

file1
int x=5;
main()
{corpo del main
}

Alla variabile globale x si può accedere solo dalla funzione main() del file sorgente specificato, ma anche da tutte le funzioni che compongono gli altri moduli del programma.

- La variabile è stata definita in un altro modulo, ma le nostre funzioni devono accedervi per leggere il valore ed eventualmente modificarlo: viene dichiarata come variabile globale facendola precedere dallo specificatore extern.
In questo esempio:

file2
extern int x;
Funz1()
{corpo di Funz1
}

Dall’interno della funzione Funz1 si può accedere alla variabile x che si presuppone definita in un altro file sorgente.

Comunque, per far si che il linker possa risolvere eventuali conflitti è indispensabile che la definizione (e non la dichiarazione) della variabile compaia in un solo dei moduli che compongono il programma.

Nel prossimo articolo tratteremo la dichiarazione delle variabili a livello interno.

Feb 26

Oggi in ufficio ci chiedevamo quel’è il Software dei desideri di ogni blogger..

Abbiamo discusso un pò ma nessuna idea, il mondo dei Software è cosi vasto…

Da qui nasce il post, lo chiediamo direttamente a voi, e in particolare ai blogger che seguiamo quotidianamente.

Quindi ragazzi ( napolux, lafra, tagliaerbe, kerouac3001, fradefra, gioxx, andrea beggi ) che Software desiderate ?

La domanda è comunque aperta a tutti i blogger, miraccomando astenersi non blogger :-D

Feb 25

Una prima definizione, anche se ampia, del termine informazione può essere:

informazione
è tutto ciò a cui l’uomo attribuisce un certo significato.

Sono informazioni, il nome di una strada, l’altezza di una persona, una serie di rintocchi di una campana, uno spot pubblicitario, il senso di morbidezza di una stoffa o il tracciato di un elettroencefalogramma.

E’ però evidente che gli esempi acquistano il reale significato di informazione solo quando diventano oggetto di interscambio tra due soggetti (chi fornisce e chi riceve l’informazione), ovvero quando sono oggetto di comunicazione tra un trasmettitore ed un ricevente.

Occorre tenere presente che gli elementi oggetto della comunicazione possono presentarsi in diverse forma, come:
- una configurazione di tipo alfabetico: come il nome di una persona, l’intestazione di un giornale o la ragione sociale di un’azienda;
- una configurazione di tipo numerico: come il peso di un oggetto, la lunghezza di un percorso o il prezzo di un paio di scarpe;
- una configurazione a livello d’immagine: come una fotografia, una pianta stradale, un istogramma delle vendite di articoli in un anno;
- una configurazione di tipo sensoriale: come la percezione dell’aumento della temperatura, la ruvidezza di una superficie o la ricostruzione di un ricordo al sentore di un certo profumo.

Spesso le informazioni vengono rappresentate anche in forme complesse, combinazione delle precedenti configurazioni e quindi la trasmissione diviene difficoltosa, come una persona che cerca di comunicare ad un’altra usando solo parole, un suono o un odore.

Questa difficoltà nasce soprattutto perchè le forme con cui si trasmettono informazioni (messaggi) sono spesso simboliche, più per comunicare descrizioni e misurazioni più che delle percezioni. Infatti, solo i grandi artisti evocano immagini, suoni, colori e persino odori attraverso una simbologia ridotta.

Per questo, la teoria dell’informazione deve tenere conto anche della codifica, per garantire che le Notizie inviate sul canale di trasmissione arrivino correttamente al ricevente.

Feb 25

La visibilità di un identificatore è costituita da quella parte di programma sorgente in cui è possibilie compiere accessi legali all’oggetto individuato da quell’identificatore.

In C++ si distinguono i seguenti livelli di visibilità:
- a livello di programma: le variabili con visibilità a livello di programma sono dichiarate a livello esterno e risultano accessibili anche alle parti di programma poste in altri file sorgente;
- a livello di file: le variabili con visibilità a livello di file sono dichiarate a livello esterno tramite un’opportuna parola chiave (static) e risultano accessibili dal punto in cui compare la loro dichiarazione fino alla fine del file sorgente in cui la dichiarazione stessa compare;
- a livello di funzione o di blocco: le variabili con visibilità a livello di blocco sono dichiarate a livello interno e risultano accessibili solo dal loro punto di dichiarazione fino alla fine del blocco.

Bisogna però fare attenzione a non confondere il periodo di vita di una variabile con la visibilità del suo identificatore, dato che una variabile globale può essere nascosta e quindi non avere campo di visibilità totale, da una dichiarazione di una variabile locale con lo stesso nome.

Per esempio, il programma C++
int i=5;
main()
{while(i<8)
{ int i=10;
cout< }
return 0;
}

che apparentemente dovrebbe mostrare una sola volta il valore 10, in realtà entra in un ciclo infinito in quanto la variabile i definita nel blocco interno del while copre la variabile i globale che viene testata e che mantiene sempre il valore iniziale 5 e non può superare il valore 8.

Feb 23

Per periodo di vita di una varabile s’intende l’intervallo di tempo nel quale la variabile stessa esiste durante la fase di esecuzione del programma. Questo concetto non si applica alle funzioni, in quanto queste ultime esistono per tutta la durata d’esecuzione del programma.

In particolare in C++ si dice che una variabile ha periodo di vita globale se essa viene allocata in memoria non appena viene avviata l’esecuzione del programma e vi permane fino alla fine del programma stesso.
Tutte le variabili globali, in mancanza di una precisa inizializzazione vengono poste automaticamente a zero.

Invece, le variabili locali, dette anche variabili automatiche (auto), hanno un periodo di vita limitato; vengono allocate in memoria ogni volta che l’esecuzione prevede l’entrata nel blocco in cui sono dichiarate e deallocate quando il blocco viene completato, liberando la memoria che può essere riutilizzata.

Le seguenti regole permettono al compilatore di stabilire quando una variabile deve essere considerata globale o locale:

- le variabili dichiarate fuori da tutte le funzioni che compongono il programma (livello esterno) hanno sempre un periodo di vita globale;
- le variabili dichiarate a livello interno, cioè dentro un blocco, hanno normalmente un periodo di vita locale. E’ possibile però, come vedremo in seguito, forzare anche per queste variabili il periodo di vita in modo che esso divenga l’intero intervallo di tempo necessario per l’esecuzione del programma;
- i parametri formali che compaiono all’interno dell’intestazione di una funzione, vengono considerati a tutti gli effetti come varabili locali appartenenti al blocco associato alla funzione.

« leggi gli articoli meno recenti