Appunti di programmazione

Appunti per il corso universitario di programmazione, riferito al linguaggio ANSI C
Redatti all'università di Venezia

ARGOMENTI

STRUTTURA COMPUTER

DEFINIZIONI

TASTIERA E TIPI

AMBIENTE E MEMORIA

COMANDI

FUNZIONI E PROCEDURE

TIPI DERIVATI

PUNTATORI

STRINGHE

ARRAY DI PUNTATORI

STRUTTURE

TYPEDEF E ENUM

PUNTATORI A PROCEDURE

ALLOCAZIONE DINAMICA

LISTE

ALGORITMI

ERRORI

PORTATA (O SCOPE O VISIBILITÀ)

si dice portata o scope di un identificatore la porzione di codice nella quale il legame tra esso e l'oggetto da esso identificato è utilizzabile


es.

int j = 7;

int main(void){

int n, k, h, i;

k = h = 3;

for (i = 1; i < k; i++){

char j;

j = 'a';

}

}

j è visibile all'interno di main tranne nel for (poiché siamo all’interno di un altro blocco ed è stata dichiarata una variabile locale)

esistono 4 tipi di visibilità:

  • visibilità nella funzione = le etichette sono le uniche ad averla (infatti sono visibili in tutti i blocchi di codice presenti nella funzione all’interno della quale sono state dichiarate)

  • visibilità nel file = ce l’hanno gli identificatori dichiarati all’esterno di qualsiasi funzione; tali identificatori saranno noti in tutte le funzioni incluse fra il punto in cui sono stati dichiarati e la fine del file

  • visibilità nel blocco = hanno visibilità all’interno del blocco le variabili che sono state dichiarate all’inizio di una funzione, così come i suoi parametri, trattati nella stessa maniera

  • visibilità nel prototipo di funzione = le uniche ad averla sono le liste di parametri incluse nel prototipo (basta solo il tipo, il nome viene ignorato)

l’occultamento delle informazioni all’interno di funzioni in modo da nascondere i dettagli dell’implementazione di queste e detto più formalmente incapsulamento delle informazioni

CLASSI DI MEMORIA

permanenza in memoria = periodo durante il quale un certo identificatore esiste in memoria (da non confondere con la visibilità)

SPECIFICHE DI CLASSE DI MEMORIA:

  1. register = prima della dichiarazione di una variabile automatica suggerisce al compilatore di conservare la variabile in uno dei registri hardware ad alta velocità del computer (però il compilatore può ignorarle se i registri sono occupati, oppure decidere di sistemare automaticamente le variabili più utilizzate nei registri)

  2. extern = permette di dichiarare degli identificatori che avranno un periodo di permanenza in memoria pari all’intero programma (vengono allocate all’inizio dell’esecuzione) e con visibilità su tutto il codice (per utilizzare la variabile dovrò redichiararla con l’attributo extern, nel blocco di codice dove mi serve)

  3. static = permette di dichiarare degli identificatori che avranno un periodo di permanenza in memoria pari all’intero programma (vengono allocate all’inizio dell’esecuzione) e con visibilità limitata al blocco in cui sono definiti

es.

#include <stdio.h>

#include <stdlib.h>


void funct_1(void);

void funct_2(void);

void funct_3(void);


int main(int argc, char *argv[])

{

int j;


for (j=0; j < 4; j++)

{

funct_1();

funct_2();

funct_3();

printf("\n");

}


return 0;

}


void funct_1(void)

{

extern int i; /* i viene definita piu' avanti */

printf("i(1) = %2d\t", i++);

}


void funct_2(void)

{

int i; /* questa e' una variabile locale

* i non e' visibile !!!

*/


printf("i(2) = %2d\t", i++); /* il contenuto di i e' impredicibile:

* area 'sporca' dello stack !!!

*/

}


void funct_3(void)

{

extern int i; /* i viene definita piu' avanti */

printf("i(3) = %2d\t", i++);

}


int i=0; /* variabile con classe di memoria extern */

AMBIENTE

l'ambiente è una struttura dinamica che ci permette di descrivere l'insieme dei nomi “validi” ad ogni istante della computazione di una porzione di codice


es.

int main(void){

i = 5;

d = 4;

d+=i;

}

l'espressione “e1, e2” che valore ha? l'ultimo calcolato ? e2


int main(void){

int x;

x = 10;

{

int y;

x +=1;

}

{

double x;

x = 2.3;

}

}


l'ambiente va consultato dal basso verso l'alto

gestisce le variabili seguendo una regola LIFO = last in, first out

in moduli diversi posso dichiarare variabili con lo stesso identificatore e dello stesso tipo; nello stesso modulo no, nemmeno se sono di tipi diversi

Ritorna sopra | Home page