我想製作三個相同長度的數組。根據文檔,必須將數組定義為 int myArray [10];
,其中10可以替換已知長度(另一個整數),或用數組 {2,3,5,6,7}
。
但是,當我嘗試聲明值 int arrSize = 10;
然後是一個數組時基於 int myArray [arrSize];
的大小,我得到以下信息:錯誤:數組綁定不是整數常量
。
是否有一種方法可以可變地確定數組大小,還是只需要對它們進行硬編碼? (我被告知硬編碼是不好的,要不惜一切代價避免。)
我想製作三個相同長度的數組。根據文檔,必須將數組定義為 int myArray [10];
,其中10可以替換已知長度(另一個整數),或用數組 {2,3,5,6,7}
。
但是,當我嘗試聲明值 int arrSize = 10;
然後是一個數組時基於 int myArray [arrSize];
的大小,我得到以下信息:錯誤:數組綁定不是整數常量
。
是否有一種方法可以可變地確定數組大小,還是只需要對它們進行硬編碼? (我被告知硬編碼是不好的,要不惜一切代價避免。)
您的問題實際上有兩部分。
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);
第二個 sizeof
位於數組每個元素的類型上,此處為 int
。
2/2 /我如何擁有動態大小的數組(例如,直到運行時才知道)?
為此,您將需要動態分配,該分配可在Arduino上運行,但通常不建議這樣做,因為這會導致“堆”碎片化。 p>
您可以執行(C方式):
//聲明int * myArray = 0; int myArraySize = 0; //分配(le t的大小假定包含一些在運行時發現的值,例如從某些外部來源獲得)if(myArray!= 0){myArray =(int *)realloc(myArray,size * sizeof(int));}否則{myArray =(int *)malloc(size * sizeof(int)) ;}
或(C ++方式):
//聲明int * myArray = 0; int myArraySize = 0; //分配(假設大小包含一些在運行時發現的值,例如從某些外部來源或通過其他程序邏輯獲得的值)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];
我認為,僅當您合理地希望用戶希望在某個時候更改設置時,才需要對代碼進行硬編碼。我不知道是不是這樣。
如果知道數組的最大長度,只需將數組初始化為該長度,然後使用整數告訴程序要使用多少數組。如果這是7,10字節之間的差異,那麼您就不會浪費那麼多的內存分配。
我知道我來晚了一點,但是從理論上講,不能使用變量來定義規則數組的數量來創建規則數組:
int arrSize; int myArray [arrSize];
這將顯示錯誤,因為在聲明數組時,程序期望括號之間的值為常數。但是,您可以通過一種方式創建一個帶有變量的數組,該變量定義通過對值集進行動態內存分配來定義該數組將要擁有的值的數量(此方法僅通過一維數組進行了測試,尚未嘗試用於
//首先,為要創建的集合創建一個用於存儲空間的指針。int* myArray; int arrSize; //然後定義變量,該變量將確定數組將要擁有的元素數量,只要在設置myArray的值之前定義此int,就可以隨時為其指定值myArray =(int *) calloc(arrSize,sizeof(int))///在這裡,您將實例myArray(其內存空間已通過創建指針分離的情況)分離為arrSize個類型為int的元素,該元素具有最大內存值(以字節為單位)等於int類型變量的最大可用值
在此之後,剩下要做的就是為實例myArray中創建的每個元素分配一個值(該值已經是到現在為止的數組),就像創建為myArray [arrSize]的普通數組一樣。