步驟1:我們需要什么要擁有
要最終以可見的方式顯示二維數組(我們稍后將討論3維數組選項),我們將創建一個記錄設備使用與我的一維數組Instructable相同的材料。這些材料是:
3個面包板按鈕(記錄按鈕,記錄其按下情況的按鈕和播放按鈕)
3個LED(指示每個按鈕何時已按下)
6個小電阻(我將使用220歐姆)
Digilent的chipKIT Uno32(運行代碼的微控制器)
跳線(
面包板(未顯示)
步驟2:關于多維數組的注意事項
一個二維數組,或與此相關的任何二維數組,本質上是多個單維數組。多維數組的好處是它可以在一個代碼段中直觀地將相關數組分組在一起。這樣,程序員不必從多個來源調用信息,而是可以指定一個來源并從那里找到他們的信息。
聲明一個維數組時,實際上就是在創建一行值。對于每個更高的維度,您都可以在值行中添加(不信不信)另一個維度。二維數組將使您的線成為值的平面,而三維數組將使值的平面成為值的立方體。
再往前走,您就會開始涉入有趣的觀點。可以將一個四維數組視為具有三個多維數據集的一行。六個維度的數組可以認為是一個立方體。等等。
不過,作為免責聲明,您在編程中幾乎不需要3維數組以外的任何東西。當然,更高維度的數組可以用作[國家/地區] [州] [縣] [鎮] [家庭] [人]或某些銷售目的的目錄/數據庫,但是(在我看來)這將更易于在多個環境中導航,較小尺寸的數組,并且其中一些數組需要大量的內存。
步驟3:聲明和初始化二維數組
但是讓我們進入實際創建這些數組的更實際的部分。添加到數組中的每個維度都會在第一組[元素]的前面添加一個額外的[元素],該元素指定每個單個維度數組的長度。
因此,對于二維數組,您可以將聲明您需要一定數量的具有一定長度的單維數組。例如,如果我想聲明一個包含3個一維數組(每個數組包含4個元素)的2D數組,我將輸入:
int myFirst2DArray [3] [4];
這很好創建我們想要的數組,但在所有12個點中都用零填充。要使用某些值初始化它,而不必以后再單獨分配它們,我們可以改為輸入:
int myFirst2DArray [3] [4] =
{
{1,2,3,4 },
{5,6,7,8},
{9,10,11,12}
};
您可以安排它,使其僅在一行上相反,但這可以使我從視覺上確保我擁有所有想要的值。
與單維數組一樣,我們可以通過說明各個方向上的哪個元素來訪問單個值我們要訪問。例如,要獲取第二個數組的一維數組的第三個值,我們輸入:
int x = myFirst2DArray [1] [2];
步驟4:聲明和初始化高維數組
同樣,當您向單個維數組添加更多維時,在聲明的前面會添加更多[elements]陣列。因此,對于一個具有三層,四行,每行中具有兩個元素的三維單維數組的三維數組,我們可以通過鍵入以下內容對其進行初始化:
int myFirst3DArray [3] [4] [2] =
{
{{10,11},{12,13},{14,15},{16,17}},
{{18,19},{20, 21},{22、23},{24、25}},
{{26,27},{28、29},{30、31},{32、33}}
};
步驟5:關于多維數組的更多信息
請注意,我們可以將數組擴展到更多通過以下方式幫助說明這三個維度:
{//整個數組
{//多維數據集的第一層
{10,11},//值的第一行/行圖層
{12,13}等,等等//圖層中的其他值行
},//多維數據集第一層的末端
{//多維數據集的第二層
{18,19}等,等等//值行
}//第二層的末尾
等,等等//第三層和值
}//整個末尾數組
。..但是那將使步驟l不必要的大而繁瑣(顯然Instructables忽略了代碼和注釋之間的某些空格),因此在一行的特定層中初始化所有值的更為精簡的版本代替了。通過這種嵌套的{}樣式,您可以創建多維數組。
請注意,在初始化數組時,您不會為高階維提供值,而只是為單維數組提供值。否則,您將嘗試以某種方式為編譯器不知道要處理的數組賦予額外的值。
步驟6:實踐中的二維數組
讓我們建立電路,以便我們可以測試二維陣列。如果您碰巧已經從我的Instructionable一維數組中設置了此電路,請隨時跳過該電路結構。
將面包板上的負電源導軌連接到標有“芯片組Uno32上的“ GND”。然后,從Uno32上的3.3V電源引腳到面包板上的正極電源線連接一根跳線。
現在,將三個按鈕中的每個按鈕放置在面包板上,使每個按鈕跨過面包板中間的山谷。使用電阻器之一將每個按鈕的一只腳連接到負電源軌。將支腳與接地的導線連接到山谷的同一側,并連接至正極電源線。
步驟7:設置電路-LED和數字信號
對于電路的視覺部分(包括LED,無論是否相信),在每個按鈕旁邊放置一個LED。在每個LED的陰極側與負電源軌之間連接一個220 Ohm的電阻。
雖然看起來不錯,但是如果我們無法從電路中發出或接收任何信號,那對我們沒有好處。要解決此問題,請從每個LED的陽極側到Uno32上自己的數字引腳的跳線,以及從每個按鈕的接地腳到Uno32上他們自己的數字引腳的跳線。我將引腳5、7和9用于按鈕,將引腳31、33和35用于LED。
步驟8:二維記錄代碼
根據記錄的性質,我們和微控制器都無法確定在實際停止記錄之前記錄將持續多長時間。因此,我們將猜測要存儲最長的記錄,陣列必須有多大。由于Uno32具有32位處理器,因此我們不必擔心整數的大小限制,除非您計劃在錄制期間一次按住(或不按住)按鈕超過24天。
假設是這種情況,我們或至少我將記錄陣列的大小設置為兩組,每組50個元素,因為我不打算記錄超過25次的按鈕按下(其中一個用于按下按鈕)并熄滅,一個按下按鈕,然后點亮)。第二組50個元素跟蹤按鈕的打開或關閉狀態,這樣您就不僅可以記錄按鈕被按下(或不按下)的時間長度,還可以猜測按鈕在開始時是否被按下。錄音。您可以在下面的文本文件中下載用于Uno32的代碼。如果尚未安裝,則需要免費的MPIDE軟件對Uno32進行編程。
可以免費簽出二維記錄視頻;您可能會注意到,它看起來與單陣列演示視頻的視頻看起來非常相似,但這是因為二維數組本質上是一組單維數組,因此兩組代碼在功能上是相同的。
第9步:您提到了3維數組嗎?
確實做到了。但這也與多維數組的固有局限性有關。此限制以內存形式出現。在創建代碼的大部分時間里,我都會將變量放在“堆棧”(編程中的內存對象)上,假定它們是局部變量,或者創建全局變量,這些變量存儲在稱為“ .data”的另一種內存類型中。 p》
我不會嘗試解釋編程中內存的詳細信息/機制(主要是因為我不太了解它,但是您可以在此處了解更多信息),而是從我的理解中了解在Uno32上創建巨型三維數組作為一種乘法表/多維數據集,我遇到了堆棧溢出問題,這意味著我試圖在內存中放置超出空間的東西,因此編譯器將多余的東西放在其他地方不應混淆的內存位置,導致在我嘗試運行該程序時該程序崩潰。我似乎無法說服該程序,動態分配的內存也應該允許我有更多的內存空間。
基本上,我內存不足,無法找到一種制作3D陣列的方法工作。
我最終確實做了一個小的2D數組工作(60 x 60),但是我們只介紹了2D數組的一個例子,最后,您可以在代碼中鍵入乘法問題并得到答案。無需先創建答案數組。這是學習新事物和實用主義之間的分界線。
責任編輯:wv
-
led
+關注
關注
241文章
23136瀏覽量
658471 -
電阻
+關注
關注
86文章
5468瀏覽量
171659
發布評論請先 登錄
相關推薦
評論