###前提・実現したいこと
Arduinoのプログラムで、それぞれの配列の長さが違うのでポインタの配列を変数としてPROGMEM機能を使った際に思った通りになりませんでした。
どうすれば上手くいくのか、できないのであれば理由を教えていただけると幸いです。
下記のプログラムは例ですが、同じ問題が起こります。
###ソースコード
Arduino
1const int Array1[] PROGMEM = {1, 2}; 2const int Array2[] PROGMEM = {4, 8}; 3const int Array3[] PROGMEM = {16, 32}; 4const int Array4[] PROGMEM = {64, 128}; 5int *const Length[] PROGMEM = {Array1, Array2, Array3, Array4}; 6 7void setup() { 8 Serial.begin(9600); 9} 10 11void loop() { 12 for (int i = 0; i < 4; i++) { 13 for (int j = 0; j < 2; j++) { 14 Serial.println(pgm_read_byte(&(Length[i][j]))); 15 } 16 } 17 while (1); 18}
###出力
Text
112 //1のはずが… 265 //2のはずが… 3239 //4のはずが… 4224 //8のはずが… 512 //16のはずが… 665 //32のはずが… 712 //64のはずが… 865 //128のはずが…
###試したこと
######直接指定してみる
Arduino
1const int Array1[] PROGMEM = {1, 2}; 2const int Array2[] PROGMEM = {4, 8}; 3const int Array3[] PROGMEM = {16, 32}; 4const int Array4[] PROGMEM = {64, 128}; 5int *const Length[] PROGMEM = {Array1, Array2, Array3, Array4}; 6 7int const Length1[][2] PROGMEM = { 8 {1, 2}, 9 {4, 8}, 10 {16, 32}, 11 {64, 128} 12}; 13 14void setup() { 15 Serial.begin(9600); 16} 17 18void loop() { 19 Serial.println(pgm_read_byte(&(Length[0][0]))); 20 Serial.println(pgm_read_byte(&(Length[0][1]))); 21 Serial.println(pgm_read_byte(&(Length[1][0]))); 22 Serial.println(pgm_read_byte(&(Length[1][1]))); 23 Serial.println(pgm_read_byte(&(Length[2][0]))); 24 Serial.println(pgm_read_byte(&(Length[2][1]))); 25 Serial.println(pgm_read_byte(&(Length[3][0]))); 26 Serial.println(pgm_read_byte(&(Length[3][1]))); 27 while (1); 28}
Text
11 22 34 48 516 632 764 8128//これだとうまくいくのはなぜなのか
###補足情報
Arduino 1.8.13
Arduino Uno を使っています。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/26 09:15
2020/07/26 09:24