2016-12-19 25 views
3

与えられたintが特定の範囲内にあるかどうかをチェックする関数を返す関数を作成したいと思います。 したがって、返される関数は、1つのパラメータ、intを取り、boolを返します。これは、返された関数が別の関数への関数ポインタとして渡されるときに必要です。これまでのところ私はこのようにそれを行うことができるだろう:関数内で関数を作成して返しますか?

bool valueIsInBounds(int value) { return value >= 0 && value <= 100; } 

int main() { 
    functionThatTakesAFunction(&valueIsInBounds); 
} 

0100は明らかに、固定値であり、私はそれを変更したいと思います。私が行うことができるようにしたいと思い何
は次のようなものです:

??? functionGenerator(int min, int max) { ??? } 

int main() { 
    functionThatTakesAFunction(&(functionGenerator(0, 100))); 
} 

私は、これはC.

+0

それはC.機能でなんとかではありませんが、実行時に動的に作成することはできません。 –

+0

ファーストクラスのファンクタを実装するためには、ファーストクラスのファンクタを実装するための精巧な機械を除いて、これをC言語で書くことはできません。 – Quentin

+0

一般的な説明は、 http://stackoverflow.com/questions/840501/で見つけることができます。どのように機能するポインタをC言語の作業 – coffeemakr

答えて

4

Cで動的に関数を生成することはできないので、次善策は関数をパラメータ化することです。

追加のパラメータとして境界を渡すことができます(または、これらの境界でグローバル変数または静的変数を設定できます)。

bool valueIsInBounds(int value, int min, int max) { return value >= min && value <= max; } 

int main() { 
    functionThatTakesAFunction(valueIsInBounds); 
} 

か:

int gMin, gMax; 
void setBounds(int min, int max) { gMin= min; gMax= max; } 
bool valueIsInBounds(int value) { return value >= gMin && value <= gMax; } 

int main() { 
    setBounds(0, 100); 
    functionThatTakesAFunction(valueIsInBounds); 
} 
4
に達成されるであろう方法を知りませんが、これは、他の言語でなんとかです知っている

ごめんなさい。コメントが言うように、これはは、あなたが関数ポインタへのパラメータ(max & min)に結合するために、いくつかのアセンブリを自分で生成する必要があり、ポータブルC.

に実装することができません。これは "トランポリン"関数と呼ばれ、そのために複数のライブラリが存在します。ここには1つがあります:https://www.gnu.org/software/libffcall/trampoline.html

上記のトランプリンライブラリーを使用した例と説明については、SO postをご覧ください。

関連する問題