- ベストアンサー
関数ポインタ配列の関数名を検索する方法とは?
- 関数ポインタ配列に格納されている関数名を文字列で検索して、配列の番号を得る方法について教えてください。
- 関数を50個まで増やす予定なので、追加や削除に耐えられる保守性の高い方法を探しています。
- 構造体を使って関数名と検索文字列をワンセットにする方法を考えましたが、適切な方法が思いつきませんでした。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#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; }
その他の回答 (2)
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; }
お礼
う…すごい。 見事過ぎます。なるほどこうするのか。 関数ポインタには慣れていなかったんですが、typedefですか~こんな使い方するんですね。 それにしても非の打ち所がない、完璧です。感動しました。 ありがとうございます、大変参考になりました。