同じ長さの3つの配列を作りたいと思います。ドキュメント]1によると、配列は int myArray[10];
として定義しなければなりません。ここで、10は既知の長さ(別の整数)に置き換えることができますし、配列 {2, 3, 5, 6, 7}
で埋めることもできます。
しかし、値 int arrSize = 10;
を宣言し、そのサイズに基づいた配列 int myArray[arrSize];
を宣言しようとすると、次のような結果になりました。エラー: array bound is not an integer constant`.
配列のサイズを可変的に決定する方法はあるのでしょうか,それともハードコーディングするしかないのでしょうか?(ハードコーディングは悪いことで、絶対に避けるべきだと教わりました)。)
この質問には2つの部分があります。
*1/ 配列の外側で、配列の定数を宣言するにはどうすればよいのでしょうか?
マクロを使うことができます。
#define ARRAY_SIZE 10
...
int myArray[ARRAY_SIZE];
を使用するか、定数
const int ARRAY_SIZE = 10;
...
int myArray[ARRAY_SIZE];
配列を初期化して、そのサイズを知る必要がある場合は、次のようにします。
int myArray[] = {1, 2, 3, 4, 5};
const int ARRAY_SIZE = sizeof(myArray) / sizeof(int);
2つ目の sizeof
は、配列の各要素の型を表すもので、ここでは int
となります。
**2/ サイズが動的(実行時までわからない)な配列を作るにはどうしたらいいですか?
そのためにはダイナミックアロケーションが必要です。Arduinoでは動作しますが、一般的には推奨されません。
(C言語では)可能です。
// Declaration
int* myArray = 0;
int myArraySize = 0;
// Allocation (let's suppose size contains some value discovered at runtime,
// e.g. obtained from some external source)
if (myArray != 0) {
myArray = (int*) realloc(myArray, size * sizeof(int));
} else {
myArray = (int*) malloc(size * sizeof(int));
}
または(C++の方法)。
// Declaration
int* myArray = 0;
int myArraySize = 0;
// Allocation (let's suppose size contains some value discovered at runtime,
// e.g. obtained from some external source or through other program logic)
if (myArray != 0) {
delete [] myArray;
}
myArray = new int [size];
ヒープフラグメンテーションの問題については、この質問を参考にしてください。
配列のサイズはコンパイル時にわかっている必要があります。そうでない場合は、動的にメモリを割り当てる必要があります。
char *chararray = malloc(sizeof(char)*x);
ここで、x(整数)はアプリケーションコードで設定できます(永続的だが設定可能な設定にしたい場合は、eepromからロードすることもできます)。
しかし、単に同じサイズの配列をいくつか宣言したい場合は、次のように定数として数値を宣言するだけです。
const int arrsize = 10;
char array1[arrsize];
int array2[arrsize];
ハードコーディングしないのは、ユーザーがどこかで設定を変更したくなることが合理的に予想される場合のみ意味があると思います。そのようなケースがあるかどうかはわかりません。