これは単純なプリプロセッサマクロで実現できます:
#define readEE(VAR) VAR = readEEPROM(AT24C32_ADDRESS, 1, VAR ## Pos)
あなたは次に使用することができます:
readEE(foo);
それは次のように展開されます:
foo = readEEPROM(AT24C32_ADDRESS, 1, fooPos);
マクロの ##
演算子は、両辺(VARとPos)を展開し、結果を連結します。 VAR自体はマクロなので(マクロを呼び出すときに渡すもの)、その値で置き換えられますが、Posではマクロではないため、Posのままです。だからあなたの変数名は、単語Posと連結して終わる。
変数名は配列内の変数名を持つループで使用することはできません - 変数名はコンパイルされたコードではなくソースコードにのみ存在するため、これらの変数名では何もできません。コンパイルされた。したがって、プリプロセッサを使用してジョブを実行する必要があります。
はい、120変数すべてに対して120行のコードを書く必要がありますが、 readEE(varname);
に短縮されています。
しかし、もっと良い解決策はMikaelのstructメソッドを使うか、単に配列を使って名前の概念について違った考えをすることです:
uint8_t data[120];
for (int i = 0; i < 120; i++) {
data[i] = readEEPROM(AT24C32_ADDRESS, 1, i);
);
したがって、すべての変数の値は data []
配列にあり、プログラム内でどの値がどの値であるかを知るだけで済みます。そして、各位置の名前をプリプロセッサマクロ:
#define FAN_SPEED 12
#define N1_TOGGLE 95
#define LEDS_TOGGLE 7
次に、数値の代わりにそれらのマクロを使用します。
Serial.println(data[FAN_SPEED]);
あるいは、マクロを使用して変数名を「マスク」することもできます。
#define fanSpeed data[12]
#define n1Toggle data[95]
#define ledsToggle data[7]
あなたが気づいたかもしれないことが1つあります:ここではあなたのコードを短縮するものはありません。 120の場所に120個の変数が格納されています。あなたが何をしても、それらの変数とその場所に何らかの形の120個のポインタが必要です。あなたが本当に行うことができるのは、コードを見ている誰かが何が起こっているのかを理解できるように、最も可読性が高いメソッドを選択することです。あなたが何をしているにしても、定義や設定を行う変数や変数名のリストがたくさんあります。これはたくさんの型付けを意味します。