みかづきブログ・カスタム

基本的にはちょちょいのほいです。

Arduinoで関数に配列を渡す 💻

f:id:kimizuka:20211012100959p:plain

ポインタを渡せば関数の引数に配列を渡すことができます。

void setup() {
  Serial.begin(9600);
}

void loop() {
  int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  checkArr(arr);
  delay(1000);
}

void checkArr(int *arr) {
  Serial.println(arr[9]); // → 9
}

ただし、関数側で引数に対してsizeofを使っても、ポインタに割り当てられたメモリを返すので、期待した値(配列に割り当てられたメモリ)は返ってきません。

void setup() {
  Serial.begin(9600);
}

void loop() {
  int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  checkArr(arr);
  delay(1000);
}

void checkArr(int *arr) {
  Serial.println(sizeof(arr) / sizeof(int)); // → 1
}
void setup() {
  Serial.begin(9600);
}

void loop() {
  int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  int size = sizeof(arr) / sizeof(int);

  checkArr(arr, size);
  delay(1000);
}

void checkArr(int *arr, int size) {
  Serial.println(size); // → 10
}

関数の引数を増やして、ポインタと一緒に配列の長さ(配列のメモリを要素の型のメモリで割ったもの)を渡すのがセオリーみたいです。

また、最近のArduino IDEでは、ポインタにしなくても自動的にポインタを渡してくれることがわかりました。
(Arduino IDE 1.8.16にて確認)

void setup() {
  Serial.begin(9600);
}

void loop() {
  int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  int size = sizeof(arr) / sizeof(int);

  checkArr(arr, size);
  delay(1000);
}

void checkArr(int arr[], int size) {
  Serial.println(arr[9]); // → 9
  Serial.println(sizeof(arr) / sizeof(int)); // → 1
  Serial.println(sizeof(size)); // → 10
}

ただし、書き方の違いだけで、sizeofに関しては同じ挙動です。