1

function.h仮定しましょう、私は(in )のようなプロトタイプを持つ関数を持っています

void function(int argument, bool flag);

この関数には、に依存する2つの異なる動作がありflagます。

早い段階で、モジュール(module.hmodule.c)でその関数を呼び出しました。

#include "function.h"

function(argument1, true);
function(argument2, false);

さらに、この関数をモジュールに渡し、その依存関係を反転させたいと仮定しましょう。

void (* funcPtr)(int argument, bool flag);

void setFuncPtr(void (* func)(int argument, bool flag))
{
  funcPtr = func;
}

今私は持つことができますfunction.c

#include "module.h"

setFuncPtr(function);

そしてでmodule.h

funcPtr(argument1, true);
funcPtr(argument2, false);

それぞれが関数を指しているが、異なるハードコード値を持つ2つのポインターを持つ方法はありますflagか?好き:

void (* funcPtrTrue)(int argument, bool flag);
void (* funcPtrFals)(int argument, bool flag);
/* Or, even better
void (* funcPtrTrue)(int argument);
void (* funcPtrFals)(int argument);
*/

void setFuncPtr(void (* func)(int argument, bool flag))
{
  funcPtrTrue  = func(argument, true);
  funcPtrFalse = func(argument, false);

}

(私は今、これは正しいコードではありませんが、必要な機能を説明する必要があります)

オリスの提案の後、物事を複雑にしましょう。boolのtypedefですfunction.h

typedef enum {
  FALSE,
  TRUE
} bool;

今、私はそれを再び機能させるためにfunction.h再び含める必要がありmodule.cます。

#include "function.h"

void functionTrue(int argument)
{
  fktPtr(argument, TRUE);
}
4

2 に答える 2

4

Cにはデフォルトの引数がありません。

funcPtr必要なパラメーターを直接呼び出すのではなく、2つの別個の関数ポインターが必要な理由があると思いflagます。もしそうなら、なぜあなたのモジュール内に2つのラッパー関数を持っていないのですか?

void (* funcPtr)(int argument, bool flag);

void setFuncPtr(void (* func)(int argument, bool flag)) {
  funcPtr = func;
}

void funcTrue(int argument)  { funcPtr(argument, true); }
void funcFalse(int argument) { funcPtr(argument, false); }
于 2013-03-25T12:40:20.073 に答える
1

構造を使用できます

struct funcstruct {
    void (*func)(int arg, bool flag);
    bool default_flag;
} funcstruct;

struct funcstruct funcPtrTrue, funcPtrFalse;

void setFuncPtr(void (* func)(int argument, bool flag))
{
  funcPtrTrue.func = func; funcPtrTrue.default_flag = true;
  funcPtrFals.func = func; funcPtrFals.default_flag = false;

}
于 2013-03-25T13:02:39.297 に答える