5

さまざまな機能を通過させたい機能があります

int func1(char *ptr)
{
    printf("%s",ptr);
    return 0;
}

func1を呼び出したい他の関数

int func2(void *i)
{
    //call i
    //here i point to function func1
    //and do something with return value of i
}

では、main() でどのように呼び出す必要がありますか?

int main()
{
    void *d;
    //SOMETHING wrong in next four line
    d=&func1("abcd");
    func2(d);
    d=&func1("xyz");
    func2(d);
    return 0;
}
4

5 に答える 5

4

func2呼び出したい目的の関数への関数ポインターを受け取る関数()と、文字列へのポインターを受け取る別のパラメーターを作成するだけです。次にfunc2、渡された関数ポインタをstr引数とともに呼び出します。

#include <stdio.h>

void func1(const char *str)
{
    puts(str);
}

void func2(void (*fp)(const char *), const char *str)
{
    fp(str);
}

int main(void)
{
    const char *str = "Hello world.";

    func2(func1, str);

    return 0;
}
于 2013-02-20T09:30:56.093 に答える
2

まず第一に、関数ポインタは関数のみを参照します。関数が呼び出されると、直接または関数ポインターを介してパラメーターがゲームに入ります。

つまり、(セットの) パラメーターを特定の関数変数にバインドするという目的を達成したい場合は、ラッパー関数を使用する必要があります。

int func1(char * pc)
{
  int i;
  /* assigne somehting to "i" and use "pc" */
  return i;
}

int func1_abcd(void)
{
  return func1("abcd")
}

int func1_xyz(void)
{
  return func1("xyz")
}

typedef int (*pfunc1_wrapper_t)(void);

int func2(pfunc1_wrapper_t pfunc1_wrapper)
{
  return pfunc1_wrapper();
}

int main(int argc, char ** argv)
{
  pfunc1_wrapper_t pfunc1_wrapper = NULL;
  int i = 0;

  pfunc1_wrapper = func1_abcd;
  i = func2(pfunc1_wrapper);

  pfunc1_wrapper = func1_xyz;
  i = func2(pfunc1_wrapper);

  ...

  return 0;
}
于 2013-02-20T08:10:58.170 に答える
2

まず最初に関数ポインタを使用して、目的の作業を行う必要があります。void ポインターの使用は、逆参照のために何にキャストするかを事前に知っている方法です。関数のアドレスを渡すので、とにかく関数ポインタにキャストする必要があります。したがって、これをすべて回避し、とにかく func ポインターを宣言してください。void *は、すべての可能性を処理できることがわかっている場合にのみ使用してください。例えば。memcpy は void * を使用します。これは、ソースの場所にある大量のデータを目的の場所にコピーするだけでよいため、許容されます。

#include <stdio.h>
void func1(char * str)
{
   printf("%s",str);
}
void func2(void * g)
{
   void (*p) (char *);   //function pointer
   p = (void (*)(char *))g;//casting void * to pi.e func pointer reqiuired eitherways.
   p("Func pointer caller");
}
void main()
{
   void * d = func1; // name of the function is itselt its address
   //printf("func1 = %d\nd = %d",func1,d);  
   func2(d);
}

これはすべて、単純な関数ポインターによって回避できます。

于 2013-02-20T07:33:51.310 に答える
1

このFunction pointersを参照し、 Wiki - Function Pointersを読んでください。コードを修正する方法がわかります。

于 2013-02-20T07:21:49.870 に答える
0

Jatin は、関数ポインターへの一般的なリンクを既に投稿しており、関数ポインターについて非常によく説明しています。

古典的な関数ポインターではなく、関数ポインターを引数として他の関数への「関数ポインター」として渡したいと思っているので、これが機能するとは思いません。

しかし、引数を 1 つのパラメーターとして関数を渡すのはなぜでしょうか? これは、パラメーターを指定して渡す関数が、func2 の外部で既に認識されている 1 つの結果のみを返すことを意味します (func2 は、既に定義されているパラメーター セットの外部で func1 を呼び出すため)。では、なぜ func1 呼び出しの結果を func2 に渡さないのでしょうか?

于 2013-02-20T07:35:46.930 に答える