[C] Definire funzioni a run time

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

[C] Definire funzioni a run time

Messaggio da FastMagister »

Ciao a tutti,

vi illustro subito qual'è il problema: ho scritto una funzione C che tra i suoi parametri ha un'altra funzione C. Per intenderci il prototipo della mia funzione è :

Codice: Seleziona tutto

double CalcolaIntegrale(double f(), double a, double b, altri parametri...)
mentre su di un altro file .c ho la funzione che definisce f:

Codice: Seleziona tutto

#include<math.h>
double f(double *x)
{
    return (*x) * log(*x);    // esempio per la funzione x * log(x)
}
il punto ora è: secondo voi, se volessi acquisire la funzione f a run-time, magari chiedendo all'utente qualcosa del tipo "Immettere la funzione f: ", come dovrei organizzare il tutto? Immagino solo che la funzione f verrebbe acquisita come stringa, ma poi? Voi come procedereste?

So che non è una questione semplicissima, ma credo sia abbastanza interessante da affrontare... Spero in vostro aiuto e consigli... Ciao e grazie
Avatar utente
paper0k
Rampante Reduce
Rampante Reduce
Messaggi: 7220
Iscrizione: lunedì 2 ottobre 2006, 13:39
Contatti:

Re: [C] Definire funzioni a run time

Messaggio da paper0k »

MMM.... Usando Bison & Flex (eventualmente fai una ricerca su Google per dettagli) potresti richiedere all'utente l'inserimento di una meta-funzione (magari con "un'aspetto" simile al C ad esempio) ed utilizzarla poi nel codice ;)
Chiunque può essere ragionevole, ma esser sani di mente è raro (Oscar Wilde)
Wiki|Blog|Twitter|Identi.ca|last.fm
Avatar utente
thelo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 269
Iscrizione: lunedì 8 gennaio 2007, 17:16

Re: [C] Definire funzioni a run time

Messaggio da thelo »

è possibile usare i puntatori a funzione(nello stile della programmazione funzionale)...
la funzione non viene aquisita come stringa, ma in questo modo:

int fun(void)
{
  ...
  ...
}

per dichiarare il puntatore a funzione, ne devi dichiarare uno dello stesso tipo della funzione.
int *fun_p = fun;

e per passare la funzione come parametro si usa:
callfunction(arg1, arg2, fun_p);

per usare la funzione all'interno di callfunction devi fare:
(*fun_p)(arg1, arg2, ...);

Spero di essere stato chiaro e non aver fatto casino...

Saluti
(b2b)
Navigammo su fragili vascelli
per affrontar del mondo la burrasca
ed avevamo gli occhi troppo belli...
Avatar utente
thelo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 269
Iscrizione: lunedì 8 gennaio 2007, 17:16

Re: [C] Definire funzioni a run time

Messaggio da thelo »

aspetta, forse non ho capito bene...
ma tu vorresti immetter il nome della funzione o il corpo???
Navigammo su fragili vascelli
per affrontar del mondo la burrasca
ed avevamo gli occhi troppo belli...
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: [C] Definire funzioni a run time

Messaggio da bite »

Se ho capito bene vuoi immettere l'intera funzione, non solo il nome di una funzione preesistente (che sarebbe più facile).

C/C++ non sono i linguaggi più adatti per fare cose di questo genere.

Flex e Bison secondo me non aiutano granché perché alla fine producono codice C da compilare.

Se proprio vuoi restare col C, penso - ma attenzione, io non l'ho mai fatto - che potresti scrivere la stringa contenente la funzione su un file, compilarla e renderla una libreria dinamica, poi farla caricare a runtime dal programma già in esecuzione. Oppure compilarla come un eseguibile con un main fittizio e lanciarlo dal programma in esecuzione con execv. Possibile, ma non semplicissimo.

I linguaggi di elezione per fare questi trucchetti sono lisp, smalltalk, ... java.
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

Re: [C] Definire funzioni a run time

Messaggio da FastMagister »

Cerco di farmi capire meglio...

vorrei che all'utente compaia a video una cosa del tipo "Immettere la funzione aritmetica di cui si vuole calcolare l'integrale: ", quello scrive qualcosa del tipo "x * log(x)", oppure "3x + 4x/5", (una qualunque insomma...) e tutto fili liscio,di volta in volta, e senza ricompilare...

Attualmente il tutto mi funziona, ma non è l'utente a fare la scelta della funzione arimetica bensì è il programmatore (io) che scrive preventivamente di volta in volta una funzione C che codifichi la funzione aritmetica di cui si desidera calcolare l'integrale. Quindi si procede con il ricompilare il tutto (il file con la funzione chiamante, il file con la chiamata ed il file con la funzione aritmetica)... Di fatto quindi, così com'è, il mio programma non risulta molto utile...

Per l'andare su altri linguaggi, al limite potrei spostarmi solo su Java... Ma è proprio impossibile in C?
Avatar utente
thelo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 269
Iscrizione: lunedì 8 gennaio 2007, 17:16

Re: [C] Definire funzioni a run time

Messaggio da thelo »

ah, quindi non è una funzione C  ;)
penso si tratti di fare il parsing della funzione per poi elaborarla
Navigammo su fragili vascelli
per affrontar del mondo la burrasca
ed avevamo gli occhi troppo belli...
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: [C] Definire funzioni a run time

Messaggio da bite »

Forse ho capito (scusate sono un po' tardo) quello che intende paper0k riguardo all'uso di flex e bison. Nelle regole di bison puoi mettere generazione di codice così come esecuzione di qualsiasi azione. Quindi con un po' di lavoro (o forse prendendo e sofisticando qualche esempio che trovi in giro) potresti costruire un interprete di un semplice o semplicissimo linguaggio matematico.
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: [C] Definire funzioni a run time

Messaggio da difesaparcosempione »

In linguaggio C me non si può fare!
Una cosa che gli può assomigliare è la possibilità di richiamare funzioni dinamicamente presenti in qualche shared object ! :)

ciao
Avatar utente
Uno
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 412
Iscrizione: sabato 3 marzo 2007, 21:47
Contatti:

Re: [C] Definire funzioni a run time

Messaggio da Uno »

difesaparcosempione ha scritto: In linguaggio C me non si può fare!
Una cosa che gli può assomigliare è la possibilità di richiamare funzioni dinamicamente presenti in qualche shared object ! :)
ciao
falso! In C si può fare ma è un pò scomodo...

Per semplicità considero solo il caso delle operazioni binarie, + - * /, bisogna definire una struttura del tipo

Codice: Seleziona tutto

typedef struct {
int (*function)(int a, int b); // puntatori a una delle quattro funzioni + - * /
Function *functionB;
Function *functionB;
int a;
int b;
int flag;
}Function;
e una funzione del tipo

Codice: Seleziona tutto

int ExecFunction (Function *Func)
{
        if (flag)
        {
               a=Func->a;
               b=Func->b;
        } else {
                a = ExecFunction (Func->functionA);
                b = ExecFunction (Func->functionB);
        }

        return Func->funtion (a, b);
}
è difficile da spiegare, comunque un espressione tipo (x + 5) * (x + 3) viene trasformata in un albero binario di computazione

Codice: Seleziona tutto

          *
   +          +
x    5     x    3
e eseguito ricorsivamente, il tutto è più facile in C++ dove oltretutto si può definire un metodo che permette di ottenere ricorsivamente la derivata (nel senso del calcolo differenziale) di una funzione...
porco diodo...
Avatar utente
paper0k
Rampante Reduce
Rampante Reduce
Messaggi: 7220
Iscrizione: lunedì 2 ottobre 2006, 13:39
Contatti:

Re: [C] Definire funzioni a run time

Messaggio da paper0k »

Uno ha scritto: falso! In C si può fare ma è un pò scomodo...
Esatto! ;)
Anche se preferisco flex/bison in questi casi, ti aiuta molto ;D
Chiunque può essere ragionevole, ma esser sani di mente è raro (Oscar Wilde)
Wiki|Blog|Twitter|Identi.ca|last.fm
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

Re: [C] Definire funzioni a run time

Messaggio da FastMagister »

Beh, avevo ragione a credere che la cosa era piuttosto complessa allora... Secondo voi in Java si può arrivare ad una soluzione più semplice?
sospiro
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 521
Iscrizione: lunedì 24 aprile 2006, 21:57
Contatti:

Re: [C] Definire funzioni a run time

Messaggio da sospiro »

ma scusa....da cosa dipende quale funzione deve essere inserita?
[url=http://"spidblog.altervista.org"]Il mio blog[/url]
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

Re: [C] Definire funzioni a run time

Messaggio da FastMagister »

Dalla scelta dell'utente...  Il programma deve calcolare l'integrale deella funzione immessa dall'utente QUALUNQUE essa sia...
Avatar utente
Uno
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 412
Iscrizione: sabato 3 marzo 2007, 21:47
Contatti:

Re: [C] Definire funzioni a run time

Messaggio da Uno »

FastMagister ha scritto: Dalla scelta dell'utente...  Il programma deve calcolare l'integrale deella funzione immessa dall'utente QUALUNQUE essa sia...
è esagerato, ad esempio l'utente potrebbe inserire come funzione il dilogaritmo? e la zeta di Riemann?
porco diodo...
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

Re: [C] Definire funzioni a run time

Messaggio da FastMagister »

diciamo tutte le funzioni composte da funzioni "comuni" (le 4 di base, sen, cos, ln, log10, potenze, sqrt...) allora...
nomeacaso
Prode Principiante
Messaggi: 9
Iscrizione: mercoledì 27 giugno 2007, 9:24

Re: [C] Definire funzioni a run time

Messaggio da nomeacaso »

La cosa migliore da fare e' usare un parsere trasformare la funzione digitata dall'utente in una serie di chiamate a funzioni math del C per calcolare il risultato. Il parser puoi scriverlo a manina oppure farti generare il codice c dai gia' citati flex/bison, l'importante e' che tu abbia chiara in mente la sintassi che le funzioni inserite dovranno avere (ad es log(base,argomento) invece di log(argomento,base); cambia tutto).
Magari puoi iniziare mettendo solo le funzioni basilari e poi aggiungere quelle piu' complicate.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti