teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/06/08 09:22

投稿

YT0014
YT0014

スコア1819

answer CHANGED
@@ -6,4 +6,62 @@
6
6
 
7
7
  なお、オフセットに関しては、質問に記載された通りになっていない可能性があるのはご承知ください。
8
8
 
9
- 使い方の詳細は「アロー演算子」辺りを調べてください。
9
+ 使い方の詳細は「アロー演算子」辺りを調べてください。
10
+
11
+ switchをいくつも書き連ねたくないとのことなので、こんな書き方はいかがでしょうか?
12
+
13
+ ```C
14
+ typedef struct
15
+ {
16
+ uint32_t a;
17
+ uint8_t b;
18
+ uint32_t c;
19
+ } s_instance;
20
+
21
+ typedef struct
22
+ {
23
+ uint32_t data;
24
+ void (*setter)(s_instance* hoge, uint32 value);
25
+ } DateSetter;
26
+
27
+ void setterToA(s_instance* hoge, uint32 value)
28
+ {
29
+ hoge->a = value;
30
+ }
31
+
32
+ void setterToB(s_instance* hoge, uint32 value)
33
+ {
34
+ hoge->b = (uint8_t)value;
35
+ }
36
+
37
+ void setterToC(s_instance* hoge, uint32 value)
38
+ {
39
+ hoge->c = value;
40
+ }
41
+
42
+ DateSetter[] dataSetterArray =
43
+ {
44
+ { 0, setterToA },
45
+ { 1, setterToB },
46
+ { 2, setterToC },
47
+ { 3, setterToA },
48
+ { 4, setterToA },
49
+ { 5, setterToA },
50
+ { 6, setterToB },
51
+ { 7, setterToB },
52
+ { 8, setterToC },
53
+ { -1, NULL } // 終端マーク
54
+ };
55
+
56
+ void hoge(s_instance *hoge, uint32_t data){
57
+ for (int i = 0; dataSetterArray[i].setter != NULL; i++) {
58
+ if (dataSetterArray[i].data == data ) {
59
+ *(dataSetterArray[i].setter)(hoge, data);
60
+ break;
61
+ }
62
+ }
63
+ }
64
+ ```
65
+
66
+ 申し訳ありませんが、環境がないので、未検証です。
67
+ 関数ポインタからの呼出しが誤っていたら申し訳ございません。