PROGRAMMIAMO
C++ - Array dinamici e overflow
Array statici

Prima di poter usare un vettore in un programma è necessario dichiararlo (esattamente come per normali variabili). Nella dichiarazione di un vettore occorre specificarne la dimensione (ovvero il numero di elementi). Tale dimensione è rappresentata sempre da un numero intero e costante:

int numeri[40];
double valori[100];
char stringa[80];

I valori 40, 100 e 80 rappresentano rispettivamente le dimensioni dei tre vettori numeri, valori e stringa.

La dimensione dev'essere prefissata al momento della dichiarazione del vettore e non può essere modificata durante l'esecuzione del programma. Un array di questo tipo si dice statico. Per un array statico in C++ non è lecito fare una cosa di questo genere:

int dim;
cout<<"Di quanti elementi hai bisogno? ";
cin>>dim;
double x[dim]; //questa istruzione non è corretta: è un errore!!!

x[0]=10;
x[1]=12;
...

Lo spezzone di programma qui sopra è sbagliato in quanto dim è una variabile e non è possibile usare una variabile per specificare la dimensione di un vettore.

Si noti, per inciso, che alcuni compilatori (fra i quali anche quello di Dev-C++) potrebbero anche accettare una scrittura del genere, benché si tratti di istruzioni non contemplate dallo standard del C++. Non è comunque una buona pratica di programmazione utilizzare codice non standard!

 

Array dinamici

Un array dinamico è un vettore la cui dimensione può essere stabilita run-time, cioè in fase di esecuzione del programma. Riprendendo il nostro esempio precedente, il modo corretto (e aderente agli standard) per realizzare un vettore dinamico in C++ è il seguente:

double *x; //questa istruzione dichiara x come puntatore a double

cout<<"Di quanti elementi hai bisogno? ";
cin>>dim;

x = new double[dim];

x[0]=10;
x[1]=12;
...

Senza entrare nei dettagli del significato delle singole istruzioni, in pratica la dichiarazione del vettore si effettua in due fasi:

  1. prima si dichiara un puntatore al tipo desiderato (int, double) con la seguente sintassi:
    tipo *nome_vettore; (esempio 'double *numeri')
  2. poi si dimensiona il vettore associato al puntatore in questo modo:
    nome_vettore = new tipo[dimensioni]; (esempio 'numeri = new double[var]')

 

Overflow di vettori

La dimensione di un vettore è il numero di elementi che quel vettore contiene e non può mai essere superata.

Questo significa che, dichiarando per esempio un vettore (statico o dinamico, non fa differenza) con dimensione 100, gli elementi disponibili vanno da 0 a 99 e basta: non è possibile usare elementi con indice superiore.

Se si supera il massimo numero di elementi dichiarato per un certo vettore si provoca un errore di overflow (termine inglese che si può tradurre in italiano con straripamento). In pratica si va a usare un'area di memoria esterna al vettore, cioè una zona di memoria che non appartiene al vettore.

L'errore di overflow di un vettore è particolarmente insidioso in quanto non viene diagnosticato dal compilatore C++ e può causare i più diversi malfunzionamenti al momento dell'esecuzione del programma.

Per esempio lo spezzone di programma seguente contiene un errore di overflow. Tuttavia non è possibile prevedere a priori come si comporterà il programma in esecuzione e in quale modo si manifesterà l'errore (il programma potrebbe bloccarsi o i risultati potrebbero essere sbagliati):

int i,num[10];

for (i=0;i<20;i++)
  num[i]=0;

L'unico modo per evitare gli errori di overflow consiste nel controllare sempre che l'indice di un vettore non superi le dimensioni assegnate per quel certo vettore (per esempio mediante la condizione di ripetizione del ciclo o inserendo un if di controllo all'interno del ciclo stesso).

 

link precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it