Enrere Mòdul 5
Fonaments de Programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Ús de vectors de punters a funcions

En aquesta pràctica veurem un exemple de punters a funcions.

 

Desenvolupament de la pràctica

Creeu un nou arxiu del tipus C++ anomenat m5pa1.cc i escriviu el següent codi:

// m5pa1.cc - Vectors de punters a funcions  -

#include <iostream>

#include <stdlib.h>


using namespace std;


void (*afuncio[4])(int,int );

void suma(int a,int b);
void resta(int a,int b);

void multiplica(int a,int b);

void divideix(int a,int b);

int main(){

    int i,c=20,d=10;

    system("clear");

    afuncio[0]=suma;
    afuncio[1]=resta;
    afuncio[2]=multiplica;
    afuncio[3]=divideix;

    for(i=0;i<4;++i)    afuncio[i](c,d);

    return 0;
}

void suma(int a,int b){
    cout <<a<<" + "<<b<<" = "<<a+b<<endl;
}

void resta(int a,int b){
    cout<<a<<" - "<<b<<" = "<<a-b<<endl;
}

void multiplica(int a,int b){
    cout<<a<<" * "<<b<<" = "<<a*b<<endl;
}

void divideix(int a,int b){
    cout<<a<<" / "<<b<<" = "<<a/b<<endl;
}

Captura de l'execució del programa.

Explicació del programa

La característica principal d'aquest programa és que pot cridar a quatre funcions diferents amb una sola sentència de crida. La línia de codi clau és la següent:

 
for(i=0;i<4;++i)    afuncio[i](c,d);

Aquesta línia és un bucle que s'executa 4 cops. Cada cop que s'executa el valor de la variable i varia de 0 fins a 3. El cos del bucle és una crida a la funció afuncio[i](). De fet, afuncio[i]() no és realment una funció sinó un punter a una funció. Aquest punter s'ha de declarar al començament com qualsevol altra variable. La declaració es fa de la següent forma:

 
void (*afuncio[4])(int,int );

D'aquesta forma es declara un vector de punters a una funció que no retorna cap valor i té dos arguments enters. 

Les següents línies assignen a cada un d'aquests quatre punters un valor inicial:
    afuncio[0]=suma;
    afuncio[1]=resta;
    afuncio[2]=multiplica;
    afuncio[3]=divideix;

El nom d'una funció sense el parèntesi s'interpreta com un punter a aquesta funció. Les funcions suma(), resta(), multiplica() i divideix() han estat prèviament declarades com funcions que no retornen cap valor i tenen dos arguments enters.

Quan es fa servir un punter a funció seguit dels parèntesis i la llista d'arguments, s'interpreta com una crida a la funció apuntada pel punter.

La sortida del programa és la següent:

 
20 + 10 = 30
20 - 10 = 10
20 * 10 = 200
20 / 10 = 2