Dovrebbe essere sufficiente un cast (Windows utilizza un sistema simile per le DLL caricate dinamicamente).
codice:
typedef double (*DOUBLE_PROC) (double[]);

typedef double (*MY_FUNCTION)( parametri vari)

g(p,(DOUBLE_PROC)f,...);

nella funzione g

void g(quel che è, DOUBLE_PROC f, ...) {
    MY_FUNCTION myfunction = (MY_FUNCTION) f;

    (*myfunction)(parametri);

}
Questo in linea di principio. Ma se non mostri i prototipi esatte delle funzioni in gioco, non si può dire molto di più.