• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:関数ポインタ配列の関数名を検索)

関数ポインタ配列の関数名を検索する方法とは?

このQ&Aのポイント
  • 関数ポインタ配列に格納されている関数名を文字列で検索して、配列の番号を得る方法について教えてください。
  • 関数を50個まで増やす予定なので、追加や削除に耐えられる保守性の高い方法を探しています。
  • 構造体を使って関数名と検索文字列をワンセットにする方法を考えましたが、適切な方法が思いつきませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

#include <stdio.h> typedef void (*funcptr)(char*); struct func_t {   const char* name;   funcptr func; }; #define F(f) { #f, f } void a(char* str) {   printf("a%s\n", str); } void b(char* str) {   printf("b%s\n", str); } void c(char* str) {   printf("c%s\n", str); } funcptr searchFunc(const char* n, struct func_t* table) {   while ( table->name != NULL ) {    if ( strcmp(table->name, n) == 0 ) {     return table->func;    }    ++table;   }   return NULL; } int main() {   funcptr p;   struct func_t ftable[] = {    F(a),    F(b),    F(c),    {NULL, NULL}   };   if ( (p = searchFunc("a",ftable)) != NULL ) (*p)("-found");   if ( (p = searchFunc("b",ftable)) != NULL ) (*p)("-found");   if ( (p = searchFunc("c",ftable)) != NULL ) (*p)("-found");   if ( (p = searchFunc("d",ftable)) != NULL ) (*p)("-found");   return 0; }

herbest
質問者

お礼

う…すごい。 見事過ぎます。なるほどこうするのか。 関数ポインタには慣れていなかったんですが、typedefですか~こんな使い方するんですね。 それにしても非の打ち所がない、完璧です。感動しました。 ありがとうございます、大変参考になりました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#22058
noname#22058
回答No.3

No.2の者です。 私の回答は外してましたね。 επιστημηさんの回答をご参考になさってください。

すると、全ての回答が全文表示されます。
noname#22058
noname#22058
回答No.2

サンプルです。 #include <stdio.h> #include <string.h> typedef void (*func)(char *); typedef struct _func_table { func function; char *name; } func_table; void display(char *s) { puts("display関数を実行しています。"); puts(s); } void output(char *s) { puts("output関数を実行しています。"); puts(s); } int main(void) { func_table table[] = { { display, "display" }, { output, "output" }, }; char name[10], str[40]; int n, i; printf("実行したい関数名:"); scanf("%s", name); n = sizeof(table) / sizeof(table[0]); for (i = 0; i < n; i++) { if (strcmp(name, table[i].name) == 0) { sprintf(str, "今、実行した関数は、%s", name); table[i].function(str); break; } } if (i == n) puts("関数が見つかりませんでした。"); return 0; }

すると、全ての回答が全文表示されます。

専門家に質問してみよう