Il linguaggio di programmazione C
 

Array di funzioni

arkkimede 5 Mar 2015 22:24
Ciao a tutti.
Avrei bisogno di alcune indicazioni relativamente ai puntatori a funzioni.

Avrei la necessita' di individuare funzioni differenti tramite degli indici.

Provo ad usare un esempio senza funzioni per spiegarmi.

Se ho un vettore a due indici, p.es. a[i][j] e voglio moltiplicare la prima riga
per una costante non devo fare altro che

for j
a[0][j] *= c;

Supponiamo adesso che cambiando indice io non indirizzi una costante ma tante
funzioni differenti che hanno in input _sempre_ le stesse grandezze, sia per
numero che per tipo: come dovrei procedere?

Ho provato a cercare in google ma non sono riuscito a trovare una sequenza di
keyords efficaci.

Ho trovato esempi di puntatori a funzione ma non sono riuscito a capire, per
esempio come fare una matrice nxm di funzioni.

Grazie per i suggerimenti che potrete darmi
fmassei@gmail.com 5 Mar 2015 22:29
On Thursday, March 5, 2015 at 10:24:41 PM UTC+1, arkkimede wrote:
> Ciao a tutti.
> Avrei bisogno di alcune indicazioni relativamente ai puntatori a funzioni.
>
> Avrei la necessita' di individuare funzioni differenti tramite degli indici.
>
> Provo ad usare un esempio senza funzioni per spiegarmi.
>
> Se ho un vettore a due indici, p.es. a[i][j] e voglio moltiplicare la prima
> riga
> per una costante non devo fare altro che
>
> for j
> a[0][j] *= c;
>
> Supponiamo adesso che cambiando indice io non indirizzi una costante ma tante
> funzioni differenti che hanno in input _sempre_ le stesse grandezze, sia per
> numero che per tipo: come dovrei procedere?
>
> Ho provato a cercare in google ma non sono riuscito a trovare una sequenza di
> keyords efficaci.
>
> Ho trovato esempi di puntatori a funzione ma non sono riuscito a capire, per
> esempio come fare una matrice nxm di funzioni.
>

Cerco d'indovinare perché non ho capito benissimo...

Se vuoi un'array n*m di puntatori a funzione basta che fai qualcosa del tipo:

typedef void(*f_t)(void);
f_t arr[n][m];

Se vuoi invece fare quello che nei linguaggi funzionali si chiamano "funzioni
parzialmente applicate" (ovvero chiami una funzione che accetta due parametri
con un parametro solo e ti porti dietro l'affare) non si può fare a meno di
qualche trucchetto (ovvero porti dietro i parametri insieme al puntatore a
funzione in qualche modo)

Ciao!
jak 8 Mar 2015 08:30
Il 05/03/2015 22:24, arkkimede ha scritto:
> Ciao a tutti.
> Avrei bisogno di alcune indicazioni relativamente ai puntatori a funzioni.
>
> Avrei la necessita' di individuare funzioni differenti tramite degli indici.
>
> Provo ad usare un esempio senza funzioni per spiegarmi.
>
> Se ho un vettore a due indici, p.es. a[i][j] e voglio moltiplicare la prima
riga
> per una costante non devo fare altro che
>
> for j
> a[0][j] *= c;
>
> Supponiamo adesso che cambiando indice io non indirizzi una costante ma tante
funzioni
> differenti che hanno in input _sempre_ le stesse grandezze, sia per numero che
per tipo: come dovrei procedere?
>
> Ho provato a cercare in google ma non sono riuscito a trovare una sequenza di
keyords efficaci.
>
> Ho trovato esempi di puntatori a funzione ma non sono riuscito a capire, per
esempio come fare una matrice nxm di funzioni.
>
> Grazie per i suggerimenti che potrete darmi
>

Potresti utilizzare un array di puntatori ad array di puntatori a
funzione. Se ad esempio le funzioni da indicizzare fossero del tipo:

int foo_0(long);

allora la dichiarazione sarebbe:

int(*(*myParray[])[])(long);

inizializzabie anche nel seguente modo:

int(*(*myParray[])[])(long) = {
{ foo_1, foo_2},
{ foo_3, foo_4}
};

se, ad esempio, vuoi utilizzare foo_3:

long val = 0;
int ret;
ret = myParray[1][0](val);

Ciao.
jak 9 Mar 2015 15:29
Il 08/03/2015 08:30, jak ha scritto:
> Il 05/03/2015 22:24, arkkimede ha scritto:
>> Ciao a tutti.
>> Avrei bisogno di alcune indicazioni relativamente ai puntatori a
>> funzioni.
>>
>> Avrei la necessita' di individuare funzioni differenti tramite degli
>> indici.
>>
>> Provo ad usare un esempio senza funzioni per spiegarmi.
>>
>> Se ho un vettore a due indici, p.es. a[i][j] e voglio moltiplicare la
>> prima riga
>> per una costante non devo fare altro che
>>
>> for j
>> a[0][j] *= c;
>>
>> Supponiamo adesso che cambiando indice io non indirizzi una costante
>> ma tante funzioni
>> differenti che hanno in input _sempre_ le stesse grandezze, sia per
>> numero che per tipo: come dovrei procedere?
>>
>> Ho provato a cercare in google ma non sono riuscito a trovare una
>> sequenza di keyords efficaci.
>>
>> Ho trovato esempi di puntatori a funzione ma non sono riuscito a
>> capire, per esempio come fare una matrice nxm di funzioni.
>>
>> Grazie per i suggerimenti che potrete darmi
>>
>
> Potresti utilizzare un array di puntatori ad array di puntatori a
> funzione. Se ad esempio le funzioni da indicizzare fossero del tipo:
>
> int foo_0(long);
>
> allora la dichiarazione sarebbe:
>
> int(*(*myParray[])[])(long);
>
> inizializzabie anche nel seguente modo:
>
> int(*(*myParray[])[])(long) = {
> { foo_1, foo_2},
> { foo_3, foo_4}
> };
>
> se, ad esempio, vuoi utilizzare foo_3:
>
> long val = 0;
> int ret;
> ret = myParray[1][0](val);
>
> Ciao.

Ammetto di esser stato impreciso e pressapochista.
Per scusarmi accludo un esempio funzionante:

/**/
#include <st*****.h>
#include <stdlib.h>

int f1(int);
int f2(int);
int f3(int);
int f4(int);
int f5(int);
int f6(int);
int f7(int);

int (*(*mf[])[])(int) = {(int (*[])(int)){f1, f2, f5, f6, 0},
(int (*[])(int)){f3, f4, 0},
(int (*[])(int)){f7, f6, f5, f4, f3, f2, f1, 0}
};

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

for(i = 0; i < sizeof mf / sizeof mf[0]; i++)
for(j = 0; (*mf[i])[j] != 0; j ++)
printf("La funzione [%d][%d] ritorna %d\n", i, j, (*mf[i])[j](10));

system("PAUSE");
return 0;
}

int f1(int a){return a + 1;}
int f2(int a){return a + 2;}
int f3(int a){return a + 3;}
int f4(int a){return a + 4;}
int f5(int a){return a + 5;}
int f6(int a){return a + 6;}
int f7(int a){return a + 7;}
/**/

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione C | Tutti i gruppi | it.comp.lang.c | Notizie e discussioni lang c | Lang c Mobile | Servizio di consultazione news.