コメントで述べたように、答えに追加するには、それはC言語でラムダ/クロージャを書くと変数にあなたがC#で行うような方法をキャプチャすることはできません。
クラスも存在しないので、関数へのインスタンス参照を渡す魔法の "thiscall"はありません。つまり、パラメータを介して手動で「状態」を渡す必要があります。だから、C#で次のようになり何か:
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);
はCで次のようになります。
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);
をなぜあなたは関数ポインタを返すされていますか? – 2501
ラムダをCで定義することはできず、確かに変数を取得できないことに注意してください。だからあなたの問題は、関数の型を宣言する方法ではなく、本体です。 – Groo
サイドノート:関数本体で単に 'exp(-x)'を呼び出さなかったのはなぜですか? –