Arduino範例講解(三)

更多閃爍的LED

編輯程式設計LED序列

在第3行,可以看到一個新結構:我們稱為陣列。陣列基本上是變數列表,在這種情況下,它是int類型的變數列表。中括號[]表示它是一個陣列。為了初始化陣列,我們使用大括號{},且每個值之間用逗號分隔。

要調用陣列中的值時,我們需要指定陣列中該值的位置。以圖blink7中的陣列為例:

int array [] = {1,2,3,4,5,6,5,4,3,2};

如果想獲取陣列的第一個值,我們使用

陣列[0]

中括號之間的零稱為索引。陣列是從零開始的,這意味著陣列中的第一個元素的索引為零。一開始可能會造成混淆,例如,array [5]會傳回6,而你希望它傳回5。
你可以想像這會導致很多問題……這就是為什麼此錯誤有自己的名字的原因:一個off-by-one error,簡稱OBOE

例如,當你嘗試讀取不在陣列內部的值時,例如array [10],Arduino將只讀取記憶體中的下一個位置,而不會意識到所讀取的值不再是陣列的一部分。它只會為您提供在記憶體中特定位置找到的值。
但是,當您寫入陣列外部的索引時,情況會變得更糟,因為你可能會覆蓋其他數據,例如恰好位於記憶體中該位置的變數或程式碼片段!這真是個壞主意…

如果您想聲明一個陣列而不進行初始化,則可以使用

array[10];

注意10是元素的數量,而最後一個元素將是array [9]!

如果您在同一行上對其進行初始化(例如在blink7中),則Arduino IDE將為您計算元素,並且你無需在大括號之間指定任何內容。

若你想知道陣列中元素的數量,可以使用sizeof(array)函式。此函式返回陣列的大小,以bytes為單位(1byte= 8bits)。但是,這不是元素的數量,在blink7中,sizeof(array)將返回20。這是因為每個元素都是一個int,而int的長度為2個byte。因此,元素總數為20/2 =10。
當我們讀取整個陣列時,可以使用它退出for迴圈:只要索引小於元素數,就可以安全地讀取陣列。我們從i = 0開始,因為第一個元素的索引為0。這次我們僅將i加1。符號”i ++”與”i = i + 1″程式碼語法相同,只是更短。另一種寫法是”i += 1″。

由於LED#1連接到引腳2,LED#2連接到引腳4、3到6等,因此我們將LED編號乘以2得到引腳編號。

Arduino參考:Array

Arduino參考:Sizeof

Arduino參考:Increment

Arduino參考:IncrementCompound

您可以更改陣列中的值來建立自己的序列,甚至可以增加或刪除元素。

摘要:

  • 陣列是許多值的列表集合,並使用中括號[]
  • 陣列的宣告:’int array [10];’
  • 陣列的宣告和初始化:’int array [] = {1,2,3,4,5,6,5,4,3,2};
  • 陣列索引從零開始,這意味著第一個元素的索引為0
  • sizeof(array)返回陣列的大小(以byte為單位)
  • sizeof(data type)返回資料型別的大小(以byte為單位)
  • sizeof(array)/ sizeof(array的data type)給出陣列中元素的數量

補充:二維陣列(矩陣)

在陣列中,元素不僅可以是daty type(如ints),還可以是其他陣列。這使您可以擁有所謂的二維陣列,可以將其與矩陣進行比較。

在blink8範例中使用了此方法:現在可以在陣列中設置led編號和delay時間。

int array [] [2] = { 
  {1,600},
  {2,100},
  {3,100},
  {4,100},
  {5,100},
  {6,600},
  {5,100} ,
  {4,100},
  {3,100},
  {2,100} 
};

請注意,在宣告多維陣列時,必須指定除{}大括號之間的第一個陣列之外的所有陣列。

從陣列中獲取值的語法是

array[row][column]

範例matrix_sum。如果您上傳此範例,它將不會執行任何操作,它沒有任何輸出,僅用於學習目的。

它建立4個矩陣(2D陣列),其中兩個具有值。然後,它僅計算兩個矩陣的和,以及第一個矩陣的換位矩陣。

這是通過使用巢狀的for-loop來完成的。您可以在上面的圖片中瞭解本說明。
這些數字是for-loop跑完陣列的順序。i用於行,j用於列。以矩陣表示的說法是從第一列和第一行(1,1)開始,[0] [0]則是陣列索引表示方法,然後該列遞增(1,2)或[1] [0],該列為再次遞增(1,3)或[2] [0]當j再次遞增時,j迴圈退出,因為j<3。i遞增,j重設為零:(2,1)或[1] [0],j遞增:(2,2)或[1] [1],然後是(2,3)或[2] [ 1]。i遞增,j重置為零:(3,1)或[2] [0],然後是(3,2)或[2] [1],最後是(3,3)或[2,2]。最後j退出,i也退出整個迴圈。

換位矩陣的計算類似,只是交換列和行:

transposeMatrix [i] [j] = matrixA [j] [i];

在這些陣列中,可以使用更多的陣列,基本上可以建立多維空間。理論上來說,維度的數量是無限的,但是一旦使用了三個以上的維度,它將變得非常複雜,這時再考慮其他更好的方法了。

發佈留言