配列、添え字に関するコンパイルエラーにつきまして。
現在、arduinoで赤外線リモコンを作成しております。
ネット上の情報を参考にON/OFFのみの送信・受信はできたので、ボタンの数(mode)を21種類に増やして送信機を作成を試みております。
赤外線のON/OFFパターンの配列データが大きかったのでdata[][67]としてPROGMEM に保管し、SRAMにondata[67]として読み込もうとしています。
この状態でコンパイルすると下記のようなエラーが出てしまいます。
[mode][i][cnt]を配列のインデックス(添え字)として使っていますが、これを使用している行にこのエラーが出ます。
調べてみると添え字はintではいけないといった情報もみかけますが、data[i]のように使用されているのをよく見かけます。
データ型を変えてみたり試してみたのですが、'char[int]' や'int[char]'のように変わるだけで解決しませんでした。
このエラーに対して何か解決策があればご教授願えないでしょうか。
よろしくお願い致します。
※エラー
invalid types 'int[int]' for array subscript
※グローバル変数(PROGMEM に保存)
const uint16_t data[21][67] PROGMEM = { /* 4bytes(16bits), Leader code & Customer code(CC) & Data code & ^Data code & Mode code */
/* data[0] */ {9200, 4500, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600},
/* data[1] */ {9200, 4500, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600},
・
・
・
/* data[20] */ {9200, 4500, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600},
};
※関数
void sendOnSignal(int mode){
int ondata[67];
for (int i = 0; i < 67; i++)
{ondata[i] = pgm_read_word_near(&(data[mode][i]));}
int dataSize = sizeof(ondata[mode]) / sizeof(ondata[mode][0]); /* IRcodeの配列数を計算。67になるはず。 */
for(int cnt = 0; cnt < 67; cnt++) /* iIndexIRcode(現在の配列)が偶数番目ならhigh。 奇数番目ならlow。 */
{
unsigned long len = ondata[mode][cnt]; /* lenに現在の配列の時間を代入。 */
unsigned long us = micros(); /* usにパルス開始時刻を記録。 */
do { /* 周波数38kHzでOn/Offするように配列の時間分点滅。 */
digitalWrite(IRLED_pin, (cnt%2) ? LOW : HIGH); /* 三項演算子[A ? B : C] (Aがtrueの場合はB,falseの場合はCを実行する) */
delayMicroseconds(8); /* キャリア周波数38kHzでON/OFFするよう時間調整 */
digitalWrite(IRLED_pin, LOW);
delayMicroseconds(7);
} while (long(us + len - micros()) > 0); /* 送信時間に達するまでループ */
}
} /* void sendSignal終了*/