[C] funkcja zwracająca funkcję

0

jest sobie funkcja rysująca inną funkcję:

void Draw (double (*fun)(double))
{...}

przykładowe wywołanie:

Draw (sin);

I dana jest struktura Poly oraz kolejna funkcja:

double Evaluate (Poly *P, double x)
{...}

Przykładowe wywołanie

Poly W = {...};
double result = Evaluate (&W, 0.2);

zwracajaca wartość wielomianu P w punkcie x. Chciałbym móc za argument funkcji Draw wstawiać coś co zostanie zwrócone przez inną funkcję. Nie chodzi mi o to, żeby tam wrzucać wskażnik do funkcji już istniejącej, tylko taką funkcję generować dynamicznie, w zależności od wielomianu P, żeby móc ją potem narysować za pomocą Draw(...). Czy da się coś takiego zrobić?

0

Nie.

Ale mozesz sie zainteresowac jezykami skryptowymi w ktorych mozesz pisac te funkcje, polecam Lua - prosta integracja z programem i sam jezyk.

0

mozesz - zainteresuj sie funktorami. ale to nie bedzie 100% wygenerowana funkcja -- kod funktora musi byc ustalony w momencie kompilacji, mozesz za to go parametryzowac, templateowac itede. jesli chcesz "wygenerowac" kod oblicajacy wartosc tego wielomianu to nie bedziesz mial problemu

0

Ja bym to zrobił tak. Dodał do funkcji Draw dodatkowy parametr, który będzie przekazywany do funkcji 'fun'. Tj

void Draw (double (*fun)(double), void *param)
{
   for(double x=...)
      rysuj_punkt(x, fun(x, param));
}

I teraz do funckji Draw przekazujesz nie tylko wskaźnik na funkcję rysowaną, ale również sposób w jaki ma się ona zachowywać. Funkcja fun miała by być taką uniwersalną funkcją, np twoj Evaluate rysujący wielomian.

double Evaluate(double x, void *wielomian)
{
  //i tu funkja analizuje wielomian i zwraca wartość w punkcie
}

//..
Poly W;

Draw(Evaluate, &W); //rysujemy wielomian

Albo inaczej. Bez dodatkowego parametru.

Funkcja Evaluate korzysta z globalnego wskaźnika na wielomian.
Jest sobie globalny

void *Wielomian; //globalny wskaźnik

double Evaluate(double x)
{
   //i tu funkcja oblicza wartość wielomianu wskazywanego przez globalny wskaźnik
}

void Draw (double (*fun)(double)) {...}

Poly W;
Wielomian = &W; //pzrypisujemydo globalnego wskaxnikajakiś wielomian
Draw(Evaluate); //rysujemy wielomian
Draw(sin);//lub coś innego

Cała zabawa polega na przekazaniu nie tylko funkcji, ale też pewnych danych określających działanie tej funkcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1