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

質問編集履歴

2

回答を実施した際の疑問点

2021/05/09 14:18

投稿

YDTM5
YDTM5

スコア5

title CHANGED
File without changes
body CHANGED
@@ -105,4 +105,133 @@
105
105
  }
106
106
  ```
107
107
  ### 補足情報
108
- ・Test_Data型の変数は本来100個ほどあるのですが、見づらくなってしまうので例として4個で記述しました
108
+ ・Test_Data型の変数は本来100個ほどあるのですが、見づらくなってしまうので例として4個で記述しました
109
+
110
+ ###回答を頂いた例を参考にして
111
+ ポインタ・列挙体・オペレータを使用する方法を試しましたが、全てやりたかったことが実現できました。
112
+ が、やりたいことは出来たのですが全ての方法で微妙に差があるためどれが適した方法なのか悩ましいです。
113
+ 個人的にはオペレータを使用した方法がクラスの使用時にシンプルかと思いましたが、メリット・デメリットありますでしょうか?
114
+
115
+ 【TEST.h】
116
+ ```c
117
+ #ifndef TEST_H
118
+ #define TEST_H
119
+ #include "arduino.h"
120
+
121
+ class TEST {
122
+ public:
123
+ struct Test_Data {
124
+ int32_t Val;
125
+ uint16_t Offset;
126
+ String Name;
127
+ };
128
+
129
+ //この変数に配列の様にアクセスしたい 例)TestAry[2].Valと記述するとLength.Valにアクセスできる等
130
+ Test_Data Height; //[0]
131
+ Test_Data Weight; //[1]
132
+ Test_Data Length; //[2]
133
+ Test_Data Position; //[3]
134
+
135
+ //ポインタ//////////////////////////////////////////////////
136
+ Test_Data *DataAry_P[4] = {
137
+ &Height,
138
+ &Weight,
139
+ &Length,
140
+ &Position
141
+ };
142
+
143
+ //列挙体//////////////////////////////////////////////////
144
+ enum TestIndex {
145
+ H_Index,
146
+ W_Index,
147
+ L_Index,
148
+ P_Index
149
+ };
150
+
151
+ Test_Data DataAry_E[sizeof(TestIndex)];
152
+
153
+ Test_Data &H(){return DataAry_E[H_Index];}
154
+ Test_Data &W(){return DataAry_E[W_Index];}
155
+ Test_Data &L(){return DataAry_E[L_Index];}
156
+ Test_Data &P(){return DataAry_E[P_Index];}
157
+
158
+ //オペレータ//////////////////////////////////////////////////
159
+ Test_Data& operator[] (uint8_t n) {
160
+ switch (n) {
161
+ case 0: return Height;
162
+ case 1: return Weight;
163
+ case 2: return Length;
164
+ case 3: return Position;
165
+ }
166
+ };
167
+
168
+ bool Test_A;
169
+ bool Test_B;
170
+ bool Test_C;
171
+
172
+
173
+ private:
174
+ };
175
+ #endif
176
+ ```
177
+
178
+ 【Main.ino】
179
+ ```c
180
+ #include "TEST.h"
181
+ TEST test;
182
+
183
+ uint32_t LastTime;
184
+ uint32_t Cnt;
185
+
186
+ void setup() {
187
+ Serial.begin(9600);
188
+
189
+ LastTime = millis();
190
+ }
191
+
192
+ void loop() {
193
+ if (millis() - LastTime >= 1000) {
194
+ LastTime = millis();
195
+ Serial.println(Cnt);
196
+
197
+ //オペレータ//////////////////////////////////////////////////
198
+ test.Height.Val = 1;
199
+ test.Weight.Val = 2;
200
+ test.Length.Val = 3;
201
+ test.Position.Val = 4;
202
+ Serial.print("Operator:");
203
+ for (uint8_t i = 0; i <= 3; i++) {
204
+ Serial.print(test[i].Val);
205
+ Serial.print(", ");
206
+ }
207
+ Serial.println();
208
+
209
+ //列挙体//////////////////////////////////////////////////
210
+ test.H().Val = 100;
211
+ test.W().Val = 200;
212
+ test.L().Val = 300;
213
+ test.P().Val = 400;
214
+ Serial.print("Enumerate:");
215
+ for (uint8_t i = 0; i <= 3; i++) {
216
+ Serial.print(test.DataAry_E[i].Val);
217
+ Serial.print(", ");
218
+ }
219
+ Serial.println();
220
+
221
+ //ポインタ//////////////////////////////////////////////////
222
+ test.DataAry_P[0]->Val = 1000;
223
+ (*test.DataAry_P[1]).Val = 2000;
224
+ test.DataAry_P[2]->Val = 3000;
225
+ test.DataAry_P[3]->Val = 4000;
226
+ Serial.print("Pointer:");
227
+ for (uint8_t i = 0; i <= 3; i++) {
228
+ Serial.print(test.DataAry_P[i]->Val);
229
+ Serial.print(", ");
230
+ }
231
+ Serial.println();
232
+
233
+ Serial.println();
234
+ Cnt++;
235
+ }
236
+ }
237
+ ```

1

タグの追加

2021/05/09 14:18

投稿

YDTM5
YDTM5

スコア5

title CHANGED
File without changes
body CHANGED
File without changes