可変サイズの配列を宣言するには(グローバル)


18

同じ長さの3つの配列を作りたいです。ドキュメントによると、配列はint myArray[10];、既知の長さ(別の整数)を10で置き換えるか、配列で埋めることができる場所として定義する必要があります{2, 3, 5, 6, 7}

ただし、int arrSize = 10;そのサイズint myArray[arrSize];に基づいて値を宣言してから配列を宣言しようとすると、次のようになりますerror: array bound is not an integer constant

配列サイズを可変的に決定する方法はありますか、それとも単にハードコードする必要がありますか?(ハードコーディングは悪いものであり、どうしても避けるべきものだと教えられました。)


私は同様の問題を抱えており、これを行いました。私も学んでいるので、それが有効な解決策であるかどうかはわかりませんが、うまくいきました。以下のベクターを使用したコードの一部を参照してください。ベクターを理解し始めるのにかなり時間がかかりましたが、私はまだ決して専門家ではありません。 #名前空間stdを使用して<string.h>を含めます。int main(){文字列名; 文字列アドレス。ひもの町。文字列の国。文字列回答; vector <vector <string >> personData; for(;;){vector <string> myTempData; cout << "名前を入力するか、終了するにはn" << endl; getline(cin、name); if(name == "n"){
bre

回答:


22

あなたの質問には実際には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];

ヒープの断片化に関する問題の詳細については、この質問を参照できます。


4
1)ARRAY_SIZE = sizeof myArray / sizeof myArray[0];この方法では、バグを導入することなくmyArrayのタイプを変更できます。同じ理由で、myArray = realloc(myArray, size * sizeof *myArray);。ところで、の戻り値をキャストしmalloc()たり、realloc()また役に立たない。2)myArray != 0Cバージョンでのチェックは、realloc(NULL, sz)と同等であり、役に立たないmalloc(sz)
エドガーボネット

const int ARRAY_SIZE = 10; int myArray [ARRAY_SIZE]; 本当に可能だと思いますか?これにより、Cで可変的に変更された配列エラーが発生します。
ArunJoe Cheriyan

CIの@ArunCheriyanは知りませんが、C ++ではコンパイルして完全に実行されます。ArduinoはC ++ベースであるため、ここでは問題はありません。
jfpoilpret

0

配列のサイズはコンパイル時にわかっている必要があります。それ以外の場合は、次を使用してメモリを動的に割り当てる必要があります。

char *chararray = malloc(sizeof(char)*x);

ここで、x(整数)はアプリケーションコードで設定できます(永続的で構成可能な設定にする場合は、eepromから読み込むことができます)。


ただし、同じサイズの配列をいくつか宣言する場合は、次のように定数を宣言する必要があります。

const int arrsize = 10;
char array1[arrsize];
int array2[arrsize];

ユーザーが何らかの時点で設定を変更することを合理的に期待する場合にのみ、物事をハードコーディングしないことは理にかなっていると思います。それが当てはまるかどうかはわかりません。


文字サイズではなく文字サイズをコーディングすると、次の2つの利点があります。1)適切に選択されたシンボルドキュメント、または少なくとも選択の理由を示唆するもの。2)プログラムまたはモジュールの他の部分をその選択に合わせて調整する必要がある場合、同じシンボルを使用する式で自動化できるため、メンテナンスがはるかに簡単になります。
Jロバート

[少し外れたトピックですが、 "ユーザー"は、多くの人の1人を意味するため、あいまいです。特に断りのない限り、通常は最終製品の消費者であるエンドユーザーを意味します。それは次のプログラマー、コードのすぐ次の消費者である可能性があり、実際、私はそれの本質的な内部の詳細を忘れてから1年以上後(実際、私自身の経験では通常)あなたかもしれません)。または、自分の製品にコードをすぐに使えるモジュールとして含めるシステム設計者。私はあなたが2番目の「ユーザー」を意味していたと思う。
JRobert

0

配列の最大長がわかっている場合は、配列をその長さに初期化し、整数を使用して、使用する配列の量をプログラムに伝えます。7,10バイトの差であれば、それほど多くのメモリ割り当てを無駄にすることはありません。


0

私はここで少し遅れていることを知っていますが、理論的には、変数を使用して通常の配列を作成して、配列の要素の量を定義することはできません:

int arrSize;
int myArray[arrSize];

これはエラーを表示します。配列を宣言するとき、プログラムは角括弧の間の値が定数であることを期待するためです。しかし、値セットの動的メモリ割り当てを通じて、この配列が持つ値の量を定義する変数を使用して配列を作成できる方法があります(このメソッドは、単次元配列でのみテストされており、まだ多次元)、それは次のようなものになります:

//First you create a pointer for the memory space to be separated for the set you're creating
int* myArray;
int arrSize; //Then you define the variable that will determine the amount of elements the array is going to have, you can give it a value whenever you want as long as this int is defined before the values in myArray are set 
myArray=(int*)calloc(arrSize,sizeof(int)) //Here, you establish that the instance myArray (whose memory space has already been separated through the creation of the pointer) will be separated into arrSize amount of elements of type int with a maximum memory value (in bytes) equal to the maximum available for the int type variables

この後は、myArray [arrSize]として作成された通常の配列の場合と同様に、インスタンスmyArray(これはすでに配列になっています)で作成されたすべての要素に値を割り当てるだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.