題:
如何聲明可變大小的數組(全局)
user3.1415927
2014-08-14 01:23:08 UTC
view on stackexchange narkive permalink

我想製作三個相同長度的數組。根據文檔,必須將數組定義為 int myArray [10]; ,其中10可以替換已知長度(另一個整數),或用數組 {2,3,5,6,7}

但是,當我嘗試聲明值 int arrSize = 10; 然後是一個數組時基於 int myArray [arrSize]; 的大小,我得到以下信息:錯誤:數組綁定不是整數常量

是否有一種方法可以可變地確定數組大小,還是只需要對它們進行硬編碼? (我被告知硬編碼是不好的,要不惜一切代價避免。)

我有一個類似的問題,並做到了。我也在學習,所以不能說這是否是有效的解決方案,但它有效。參見下面的使用向量的代碼部分,我花了很多時間才開始理解它們,而且我仍然不是專家:#include #include #include #include #include 使用命名空間std; int main(){字符串名稱;字符串地址;弦鎮弦國家字符串答案; vector > personData; for(;;){vector myTempData; cout <<“輸入名稱或n退出” << endl; getline(cin,名稱); if(name ==“ n”){bre
四 答案:
jfpoilpret
2014-08-14 01:40:33 UTC
view on stackexchange narkive permalink

您的問題實際上有兩部分。

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];  

有關堆碎片問題的更多信息,您可以參考此問題

1)`ARRAY_SIZE = sizeof myArray / sizeof myArray [0];`,這樣您就可以更改myArray的類型而不會引入錯誤。出於同樣的原因,`myArray = realloc(myArray,size * sizeof * myArray);`。順便說一句,轉換`malloc()`或`realloc()`的返回值也是沒有用的。 2)在C版本中檢查`myArray!= 0'是沒有用的,因為`realloc(NULL,sz)`等同於`malloc(sz)`。
const int ARRAY_SIZE = 10; int myArray [ARRAY_SIZE];您真的認為有可能嗎?這將在C中給出可變地修改的數組錯誤。
我不知道C中的@ArunCheriyan,但是在C ++中,它可以編譯並完​​美運行。由於Arduino基於C ++,因此這裡沒有問題。
user2973
2014-08-14 01:37:53 UTC
view on stackexchange narkive permalink

必須在編譯時知道數組的大小。否則,您應該使用以下方式動態分配內存:

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

其中x(一個整數)可以可以在應用程序代碼中設置(如果希望將其設置為持久但可配置的設置,則可以從eeprom加載它。)


但是,如果您只想聲明一些相同大小的數組,只需聲明一個常量就可以像這樣:

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

我認為,僅當您合理地希望用戶希望在某個時候更改設置時,才需要對代碼進行硬編碼。我不知道是不是這樣。

用符號代替用字面說明編碼大小可以提供兩個好處:1)精心選擇的符號說明或至少暗示了選擇的原因; 2)當需要根據該選擇調整程序或模塊的其他部分時,使用相同符號的表達式可使該操作自動進行,從而使維護工作變得非常容易。
[有點題外話,但是]“用戶”是模棱兩可的,因為它可能意味著許多人中的一個。如果沒有另外說明,通常表示最終用戶,即最終產品的消費者。在我忘記了代碼的實質內容之後,可能是下一個程序員,代碼的下一個消費者,實際上可能是*您*(根據我自己的經驗,通常是一年或更長時間)。 )。或系統設計師將您的代碼作為現成的模塊包含在他/她的產品中。我懷疑您是第二個“用戶”。
MichaelT
2018-05-30 03:16:36 UTC
view on stackexchange narkive permalink

如果知道數組的最大長度,只需將數組初始化為該長度,然後使用整數告訴程序要使用多少數組。如果這是7,10字節之間的差異,那麼您就不會浪費那麼多的內存分配。

NibboNSX
2019-01-16 12:29:51 UTC
view on stackexchange narkive permalink

我知道我來晚了一點,但是從理論上講,不能使用變量來定義規則數組的數量來創建規則數組:

  int arrSize; int myArray [arrSize];  

這將顯示錯誤,因為在聲明數組時,程序期望括號之間的值為常數。但是,您可以通過一種方式創建一個帶有變量的數組,該變量定義通過對值集進行動態內存分配來定義該數組將要擁有的值的數量(此方法僅通過一維數組進行了測試,尚未嘗試用於

  //首先,為要創建的集合創建一個用於存儲空間的指針。int* myArray; int arrSize; //然後定義變量,該變量將確定數組將要擁有的元素數量,只要在設置myArray的值之前定義此int,就可以隨時為其指定值myArray =(int *) calloc(arrSize,sizeof(int))///在這裡,您將實例myArray(其內存空間已通過創建指針分離的情況)分離為arrSize個類型為int的元素,該元素具有最大內存值(以字節為單位)等於int類型變量的最大可用值 

在此之後,剩下要做的就是為實例myArray中創建的每個元素分配一個值(該值已經是到現在為止的數組),就像創建為myArray [arrSize]的普通數組一樣。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...