PROGRAMMIAMO
C++ - Usare le funzioni
Utilizzare una funzione scritta da altri nel proprio programma

Le funzioni della library standard del C++ sono numerose, ma ovviamente non coprono tutti i casi e tutte le esigenze possibili. Tuttavia spesso è assai facile trovare una funzione già scritta che risolva il nostro particolare problema con una semplice ricerca in rete. Per vedere come si fa, consideriamo un esempio concreto di utilizzo di una funzione già scritta da altri in un nostro programma.

Supponiamo di aver bisogno di scrivere un programma per il calcolo dei numeri primi. Invece di provare a risolvere direttamente il problema, una veloce ricerca in internet ci consente di trovare subito molte funzioni già scritte che fanno al caso nostro. Uno fra i molti esempi si può vedere in questa pagina.

La funzione si chiama isprime e il suo codice è scritto sotto Code. Per usare la funzione è sufficiente copiarla e incollarla in un file cpp creato con Dev-C++. Non è assolutamente necessario cercare di comprendere come è stata scritta la funzione: basta solo saperla usare! La funzione dev'essere incollata sotto al programma main, come mostrato in figura:

#include <cstdlib>
#include <iostream>

using namespace std;

int isprime(int x);

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

system("PAUSE");
return EXIT_SUCCESS;
}

int isprime(int x)
{
int prime = 0;
int i = 0;

for (i = (x - 1); i > 1; --i)
  {

  if ((x % i) == 0)
    {
    prime = 0;
    return prime;
    }
   else
    {
    prime = 1;
    }
  }

return 1;
}

E' stato necessario ricopiare il codice della funzione poiché non si tratta di una funzione di library (come la pow o la strlen viste in precedenza), cioè di una funzione già incorporata nel compilatore C++. Questa è una funzione "esterna", che non fa parte in sostanza del linguaggio.

Prototipo

Oltre a copiare la funzione in fondo al file, per poterla usare è stato anche necessario aggiungere in testa al file il prototipo della funzione, cioè questa riga:

Il prototipo è sostanzialmente uguale alla prima riga della funzione (detta anche intestazione) seguita dal punto e virgola e serve in pratica per dichiarare la funzione. In altre parole il suo scopo è molto simile alla dichiarazione delle variabili, cioè serve per dichiarare al compilatore la presenza della funzione all'interno del programma. I prototipi delle funzioni devono essere scritti sempre in testa al programma prima del main. In assenza di prototipo il compilatore, al momento della traduzione del programma, segnala un messaggio di errore poiché non riconosce come valida la corrispondente chiamata alla funzione.

Se qualcuno a questo punto si sta domandando perché nelle funzioni di library non è necessario dichiarare il prototipo, la risposta è che in questi casi il prototipo è già contenuto all'interno del file include (es. math.h) che bisogna scrivere all'inizio del file. Il file include contiene al suo interno tutti i prototipi di tutte le funzioni di library di una certa categoria (es. tutte le funzioni matematiche): in questo modo il programmatore non è obbligato ogni volta a ricordarsi o ad andare a cercare il prototipo di una determinata funzione di library. In effetti è possibile non usare i file include e scrivere direttamente il prototipo delle singole funzioni, anche nel caso delle funzioni di library.

 

Chiamata

A questo punto per usare la funzione è necessaria un'ultima cosa: occorre chiamarla, cioè in pratica bisogna invocarne l'esecuzione all'interno del main. Per chiamare una funzione bisogna sapere come si usa. Si faccia attenzione: come si è già detto, non occorre sapere come è stata scritta o come "funziona" la funzione per poterla usare. Basta semplicemente conoscere le semplici regole per il suo utilizzo.

Nel nostro caso la spiegazione di uso è contenuta all'inizio della pagina dove è scritto:

"I'm in the process of learning C, so to exercise my loop knowledge, I created a little function to determine if a number is prime or not. A return value of 1 indicates that it is; 0 that it isn't. "

L'ultima frase tradotta in italiano dice che: un valore di ritorno di 1 indica che il numero è primo; 0 indica invece che non è un numero primo. In altre parole la spiegazione ci dice che la funzione esamina il numero e restituisce un valore di ritorno che vale 1 se il numero è primo, 0 se non è primo.

A questo punto dovremmo essere in grado di usare la funzione. Un esempio molto semplice è il seguente:

#include <cstdlib>
#include <iostream>

using namespace std;

int isprime(int x);

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

int num, ris;

cout<<"Dammi un numero intero positivo: ";
cin>>num;

ris = isprime(num);

if (ris==1)
  cout<<"Il numero e' primo\n";
else
  cout<<"Il numero non e' primo\n";

system("PAUSE");
return EXIT_SUCCESS;
}

int isprime(int x)
{
int prime = 0;
int i = 0;

for (i = (x - 1); i > 1; --i)
  {

  if ((x % i) == 0)
    {
    prime = 0;
    return prime;
    }
   else
    {
    prime = 1;
    }
  }

return 1;
}

La chiamata della funzione è la riga:

ris = isprime(num);

Come già sappiamo, num è l'argomento della chiamata e ris contiene il valore di ritorno. Si osservi che ris e num sono due variabili dichiarate all'interno del main (vengono dette, come vedremo meglio in seguito, variabili locali al main). Quando si chiama una funzione, non ha nessuna importanza sapere quali sono i nomi delle variabili usati all'interno della funzione. La funzione è una specie di "scatola nera", un meccanismo per svolgere automaticamente un calcolo. Non occorre aprire la scatola e vedere cosa contiene per usarla.

Per esempio nel nostro caso, se andiamo a "sbirciare" il codice della funzione, vediamo subito che la variabile che contiene il numero si chiama x (e non num). Ebbene, questo non ha nessuna importanza! Il nome della variabile usato all'interno della funzione viene automaticamente sostituito (vedremo poi cosa significa questo esattamente) col nome della variabile usato nel main.

Funzione all'interno di un file separato

Oltre a mettere la funzione all'interno dello stesso file che contiene il main, è anche possibile scriverla in un file separato (sempre con estensione .cpp). Questa soluzione in effetti spesso è preferibile, soprattutto quando una stessa funzione dev'essere riutilizzata più volte con programmi differenti: in questo modo non è necessario ricopiare il codice della funzione in tutti i file in cui essa è usata.

Consideriamo di nuovo l'esempio precedente della funzione isprime. Per aggiungere un nuovo file al nostro progetto in Dev-C++ basta cliccare col tasto destro sul nome del progetto (Progetto1 nell'esempio in figura) e scegliere Nuova unità (questo se il file, come nel nostro caso, non esiste ancora; se si vuole aggiungere al progetto un file già esistente bisogna scegliere Aggiungi al Progetto):

In questo modo viene aggiunto al progetto un file vuoto che per default viene chiamato SenzaTitolo. Naturalmente è preferibile cambiarne il nome, dandogliene uno un po' più significativo (es. primi.cpp: attenzione, bisogna specificare l'estensione del file se lo si rinomina, altrimenti Dev-C++ per qualche oscuro motivo non lo riconosce come valido).

A questo punto basta fare click su primi.cpp per aprire il file (inizialmente vuoto) e copiare al suo interno il codice della funzione:

Tutto qui! Nel file main.cpp, in testa, bisogna sempre mettere il prototipo della funzione, ma la funzione stessa rimane in un file separato.

link precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it