fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // 関数本体
  5. void func_case_01(void) { printf("case 1:\n"); }
  6. void func_case_02(void) { printf("case 2:\n"); }
  7. void func_case_07(void) { printf("case 7:\n"); }
  8. void func_case_08(void) { printf("case 8:\n"); }
  9. void func_case_09(void) { printf("case 9:\n"); }
  10. void func_case_11(void) { printf("case 11:\n"); }
  11. void func_case_14(void) { printf("case 14:\n"); }
  12. void func_case_17(void) { printf("case 17:\n"); }
  13.  
  14. // 関数ポインタ配列
  15. typedef void (*FUNCPTR) (void);
  16. struct FUNC_CASE_ARRAY {
  17. int cs; // case の定数
  18. FUNCPTR p_func; // 呼ぶべき関数
  19. } fc_array[] = {
  20. {17, func_case_17},
  21. { 7, func_case_07},
  22. { 2, func_case_02},
  23. {11, func_case_11},
  24. { 8, func_case_08},
  25. { 1, func_case_01},
  26. {14, func_case_14},
  27. { 9, func_case_09},
  28. };
  29. #define n_array (sizeof(fc_array)/sizeof(fc_array[0])) // 個数
  30.  
  31. // struct FUNC_CASE_ARRAY の cs 比較関数 (for qsort, bsearch)
  32. int compfunc(const void *m1, const void *m2)
  33. {
  34. struct FUNC_CASE_ARRAY *mi1 = (struct FUNC_CASE_ARRAY *) m1;
  35. struct FUNC_CASE_ARRAY *mi2 = (struct FUNC_CASE_ARRAY *) m2;
  36.  
  37. return mi1->cs - mi2->cs;
  38. }
  39.  
  40. // case の定数 n で該当の関数をコール (switch)
  41. void call_func(int n)
  42. {
  43. struct FUNC_CASE_ARRAY key, *res;
  44.  
  45. key.cs = n;
  46. res = bsearch(&key, fc_array, n_array, sizeof(struct FUNC_CASE_ARRAY), compfunc);
  47. if (!res) {
  48. printf(" -\n");
  49. } else {
  50. res->p_func();
  51. }
  52. }
  53.  
  54. //
  55. int main()
  56. {
  57. int i;
  58.  
  59. qsort(fc_array, n_array, sizeof(struct FUNC_CASE_ARRAY), compfunc);
  60. for (i = 0; i <= fc_array[n_array - 1].cs; i++) {
  61. printf("[case %2d:] ", i);
  62. call_func(i);
  63. }
  64.  
  65. return 0;
  66. }
  67.  
Success #stdin #stdout 0s 2292KB
stdin
Standard input is empty
stdout
[case  0:]  -
[case  1:] case  1:
[case  2:] case  2:
[case  3:]  -
[case  4:]  -
[case  5:]  -
[case  6:]  -
[case  7:] case  7:
[case  8:] case  8:
[case  9:] case  9:
[case 10:]  -
[case 11:] case 11:
[case 12:]  -
[case 13:]  -
[case 14:] case 14:
[case 15:]  -
[case 16:]  -
[case 17:] case 17: