回答編集履歴

1

追記

2020/06/08 09:22

投稿

YT0014
YT0014

スコア1708

test CHANGED
@@ -15,3 +15,119 @@
15
15
 
16
16
 
17
17
  使い方の詳細は「アロー演算子」辺りを調べてください。
18
+
19
+
20
+
21
+ switchをいくつも書き連ねたくないとのことなので、こんな書き方はいかがでしょうか?
22
+
23
+
24
+
25
+ ```C
26
+
27
+ typedef struct
28
+
29
+ {
30
+
31
+ uint32_t a;
32
+
33
+ uint8_t b;
34
+
35
+ uint32_t c;
36
+
37
+ } s_instance;
38
+
39
+
40
+
41
+ typedef struct
42
+
43
+ {
44
+
45
+ uint32_t data;
46
+
47
+ void (*setter)(s_instance* hoge, uint32 value);
48
+
49
+ } DateSetter;
50
+
51
+
52
+
53
+ void setterToA(s_instance* hoge, uint32 value)
54
+
55
+ {
56
+
57
+ hoge->a = value;
58
+
59
+ }
60
+
61
+
62
+
63
+ void setterToB(s_instance* hoge, uint32 value)
64
+
65
+ {
66
+
67
+ hoge->b = (uint8_t)value;
68
+
69
+ }
70
+
71
+
72
+
73
+ void setterToC(s_instance* hoge, uint32 value)
74
+
75
+ {
76
+
77
+ hoge->c = value;
78
+
79
+ }
80
+
81
+
82
+
83
+ DateSetter[] dataSetterArray =
84
+
85
+ {
86
+
87
+ { 0, setterToA },
88
+
89
+ { 1, setterToB },
90
+
91
+ { 2, setterToC },
92
+
93
+ { 3, setterToA },
94
+
95
+ { 4, setterToA },
96
+
97
+ { 5, setterToA },
98
+
99
+ { 6, setterToB },
100
+
101
+ { 7, setterToB },
102
+
103
+ { 8, setterToC },
104
+
105
+ { -1, NULL } // 終端マーク
106
+
107
+ };
108
+
109
+
110
+
111
+ void hoge(s_instance *hoge, uint32_t data){
112
+
113
+ for (int i = 0; dataSetterArray[i].setter != NULL; i++) {
114
+
115
+ if (dataSetterArray[i].data == data ) {
116
+
117
+ *(dataSetterArray[i].setter)(hoge, data);
118
+
119
+ break;
120
+
121
+ }
122
+
123
+ }
124
+
125
+ }
126
+
127
+ ```
128
+
129
+
130
+
131
+ 申し訳ありませんが、環境がないので、未検証です。
132
+
133
+ 関数ポインタからの呼出しが誤っていたら申し訳ございません。