2016-09-13 1 views
0

Ich versuche, einen Funktionszeiger zu definieren, der e^-x berechnet. Etwas ähnlich wie C# -Äquivalent:Funktionszeiger für die Umkehrung der Exp-Funktion in c

Func<double, double> f = x => Math.Exp(-x); 

Ich versuchte vergeblich, durch wie etwas zu tun:

double(*negativeExp(double x))(double) { 
    double eValue = exp(1); 
    return pow(eValue, -x); 
} 

Irgendwelche Ideen.

+0

Warum kehren Sie einen Funktionszeiger? – 2501

+0

Beachten Sie, dass Sie in C kein Lambda definieren können, und Sie können sicherlich keine Variablen erfassen. Ihr Problem ist also, wie Sie den Funktionstyp deklarieren, nicht den Körper. – Groo

+0

Randnotiz: Warum haben Sie 'exp (-x)' nicht einfach im Funktionskörper aufgerufen? –

Antwort

3

Der Code für die Funktion wäre:

double f(double x) 
{ 
    return exp(-x); 
} 

Dann Sie einen Zeiger auf diese Funktion machen. Beispiel Verwendung:

int main(void) 
{ 
    double (*p)(double) = &f; 

    printf("f(1) == %f", p(1)); 
} 
+0

Gibt es einen Unterschied zwischen 'double (* p) (double) = & f;' und 'double (* p) (double) = f;'? – Pierre

+1

@Pierre gibt es keinen Unterschied. – mch

0

auf die Antwort hinzuzufügen, wie in den Kommentaren erwähnt, es ist nicht möglich lambdas/Verschlüsse in C zu schreiben und erfassen Variablen, wie Sie in C# tun würden.

Es gibt auch keine Klassen, also keinen magischen "thiscall", der die Instanzreferenz an die Funktion weitergibt. Dies bedeutet, dass Sie jeden "Zustand" manuell über Parameter übergeben müssen. So etwas wie dies in C# aussehen:

public class SomeClass 
{ 
    private int _someParameter; 

    public SomeClass(int p) { _someParameter = p; } 

    public int DoStuff(Func<int> process) => process(_someParameter); 
} 

// somewhere in main 
var s = new SomeClass(5); 
var result = s.DoStuff(x => x * 2); 

Wäre so etwas in C aussehen:

struct SomeClass 
{ 
    int someParameter; 
}; 

// all "member functions" need to get the "this" reference 

void SomeClassInit(struct SomeClass *_this, int p) 
{ 
    _this->someParameter = p; 
} 

int DoStuff(struct SomeClass *_this, int(*process)(int)) 
{ 
    return process(_this->someParameter); 
} 

int Process(int x) 
{ 
    return x * 2; 
} 

// somewhere in main 
struct SomeClass s; 
SomeClassInit(&s, 5); 
return DoStuff(&s, Process);