Vector de funcions

[Listening: el tecleig del Rida]

Ahir estava programant una funció en la q volia poder passar-li un nombre indeterminat de funcions per paràmetre (una funció q rebés una funció multi variable matemàtica i les seves respectives derivades parcials, essent el nombre de variables no fixe). Total, q vaig pensar de crear un vector de punters a funcions.
Si un punter a una funció era una cosa tal q:

float (*f)(vector<float>)


pensava fer el vector

vector<float (*f)(vector<float>)>

El problema és q el tipus del vector ha de ser una constant, i això invalida les crides de funció:
a function call cannot appear in a constant-expression

Total, q al final el q vaig fer va ser crear un vector de punters a float, inserir-hi punters a funcions emmascarats com a punters a float, i a l’hora de recuperar el punter emmascarar-lo de nou com a punter a funció:


float dA1(vector<float> v);

vector<float *> f;
f.push_back((float*)dA1);

vector<float *>::iterator it;
float (*f)(vector<float>) = (float (*)(vector<float>))*it;

vector<float> x;
y=f(x);

I resulta q funciona! :-)

Per cert, per a poder empegar codi en el html he fet servir aquesta web

[listening: el mouse del Rida]

Anuncis
Comments
3 Responses to “Vector de funcions”
  1. m.a. ha dit:

    Un puntero es un puntero y ocupa lo que un puntero. En mi caso son 4 bytes de 8 bits, pero para gustos compiladores…
    Un puntero a float ocupa lo mismo que un puntero a función y como C no hace comprobación de tipos, ya le va bien que quieras guardar un puntero en el sitio de un puntero.

    Así que ojo; yo usaría:
    f.push_back((float*)(&dA1));
    en lugar de:
    f.push_back((float*)dA1);
    porque no tengo ni idea de cuánto ocupa una función, pero sí sé lo que ocupa un puntero (después, cuando recuperas la función, habría que usar el operador * para llamarla).

    Si pegas un ejemplo completo, podemos comprobar si estás corrompiendo memoria en ese push_back o si estoy paranoico perdido.

    Si yo hubiera tenido que resolver ese problema, hubiera hecho algo parecido a lo siguiente (disculpa el tabulado, que seguro que queda mal):

    #include
    #include
    using namespace std;

    typedef float Func(vector);
    typedef Func* FuncP;

    float da1(vector v){
    return 23.0;
    }

    int main(void){
    vector funcs;
    funcs.push_back(&da1);

    vector params;
    cout

  2. m.a. ha dit:

    No me ha cogido el código completo. No sé si tiene que ver con el cout…

    #include
    #include
    using namespace std;

    typedef float Func(vector);
    typedef Func* FuncP;

    float da1(vector v){
    return 23.0;
    }

    int main(void){
    vector funcs;

    funcs.push_back(&da1);

    vector params;

    (*funcs[0])(params); // Devuelve 23, haz un cout

    return 0;
    }

  3. anton ha dit:

    basicamente, un typedef?

    ant

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

Connecting to %s

%d bloggers like this: