3

最初にいくつかの基本的なことを理解していることを確認する必要があります:

  1. 関数Aをパラメーターとして関数Bに渡すにはどうすればよいですか?
  2. Bの内側から関数Aを呼び出すにはどうすればよいですか?

さて、大きな苦痛のために:

私はこれに沿って何かをしようとしています:

jmp_buf buf;
buf.__jmpbuf[JB_PC] = functionA;
longjmp(buf,10);

longjmp関数に行くために使いたいという意味。どうすればいいですか?

4

2 に答える 2

3

関数へのポインタを使用する必要があります。関数ポインタを宣言するための構文は次のとおりです。

rettype (*)(paramtype1,paramtype2,...,paramtypeN)

したがって、たとえば、次のコードがあります。

char functionA(int x)
{
      printf("%d\n",x):
      return 'a';
}

char functionB(char (*f)(int), int val)
{
       return f(val); // invokes the function pointer
}

int main(int argc, char* argv[])
{
       char result = functionB(&functionA,3); // prints "3"
       printf("%c\n",result); // prints 'a'
       return 0;
}

また、&functionAはfunctionAのアドレスを取りますが、実際にはアンパサンドを使用する必要はありません...関数ポインタであることがより明確になると思うので、私は個人的に行います。関数を呼び出すときと同じ構文を使用して、関数ポインターを呼び出します。

ジャンプバッファの使用に関しては、あなたがしていることは信頼できるものではないと思います。関数を呼び出す前にジャンプバッファを作成してsetjmpを呼び出し、後でlongjmpを呼び出して、呼び出しの直前に戻るようにする場合は、明確に定義されています。ただし、jmp_bufの実際の定義と構造は、実装固有です。満たす必要のある特定の要件があります(たとえば、setjmpは値で取得し、変更できる必要があるため、配列型である必要があります)が、それ以外の場合、setjmp.hの仕様では定義されていません。 jmp_bufの構造。したがって、jmp_bufを直接操作しようとするものはすべて、特定のプラットフォームに固有のものになります。

于 2010-05-18T09:09:46.970 に答える
0
  1. functionAをパラメーターとしてfunctionBに渡す:

    typedef void function_type(void);

    void functionA(void){printf("これは関数Aです\n"); }

    int main(int argc、char ** argv){functionB(&functionA); 戻り値(0); }

  2. 関数Bから関数Aを呼び出す:

    void functionB(function_type * func){func(); }

  3. 関数に移動するために使用longjmp()します。最善の答えは「これをしないでください」です。ほとんどの場合、同じ目的を達成するためのより良い方法があります。これが必要な状況を説明していただけますか?

于 2010-05-18T09:15:04.517 に答える