1

みんな、私はWebサービスの割り当てに取り組んでおり、サーバーがランダムなものを皿に盛ってURIを読み取っていますが、URIで読み取ったものに応じてサーバーに別の機能を実行させたいと思っています。関数ポインターを使用してこれを実行できることは理解していますが、char* を読み取って関数ポインターに割り当て、その関数を呼び出す方法が正確にはわかりません。私がやろうとしていることの例: http://pastebin.com/FadCVH0h

私はswitchステートメントを使用できたと思いますが、もっと良い方法があるかどうか疑問に思っています。

4

2 に答える 2

3

char *そのためには、文字列を関数ポインターにマップするテーブルが必要になります。技術的には関数ポインタは文字列ではないため、関数ポインタを文字列に割り当てると、プログラムのセグメンテーション違反が発生します。

注: 次のプログラムは、デモンストレーションのみを目的としています。境界チェックは含まれず、ハードコードされた値とマジック ナンバーが含まれます。

今:

void print1()
{
   printf("here");
}

void print2() 
{
   printf("Hello world");
}
struct Table {
  char ptr[100];
  void (*funcptr)(void)
}table[100] = {
{"here", print1},
{"hw", helloWorld}
};

int main(int argc, char *argv[])
{
   int i = 0;
   for(i = 0; i < 2; i++){
      if(!strcmp(argv[1],table[i].ptr) { table[i].funcptr(); return 0;}
   }
   return 0;
}
于 2013-02-22T18:56:23.113 に答える
0

C で関数ポインタがいかに優れているかを理解するのに役立つと思われる非常に単純な例を示します (たとえば、シェルを作成したい場合)。

たとえば、次のような構造体があるとします。

typedef struct s_function_pointer
{
    char*      cmp_string;
    int        (*function)(char* line);
}              t_function_pointer;

次に、参照する t_function_pointer 配列を設定できます。

int     ls_function(char* line)
{
      // do whatever you want with your ls function to parse line
      return 0;
}

int     echo_function(char* line)
{
      // do whatever you want with your echo function to parse line
      return 0;
}

void    treat_input(t_function_pointer* functions, char* line)
{
       int    counter;
       int    builtin_size;

       builtin_size = 0;
       counter = 0;
       while (functions[counter].cmp_string != NULL)
       {
             builtin_size = strlen(functions[counter].cmp_string);
             if (strncmp(functions[counter].cmp_string, line, builtin_size) == 0)
             {
                   if (functions[counter].function(line + builtin_size) < 0)
                          printf("An error has occured\n");
             }
             counter = counter + 1;
       }
}

int     main(void)
{
     t_function_pointer      functions[] = {{"ls", &ls_function},
                                            {"echo", &echo_function},
                                            {NULL, NULL}};
     // Of course i'm not gonna do the input treatment part, but just guess it was here, and you'd call treat_input with each line you receive.
     treat_input(functions, "ls -laR");
     treat_input(functions, "echo helloworld");
     return 0;
}

お役に立てれば !

于 2013-02-22T19:08:06.633 に答える