如何创建和使用多维数组

电子说

1.2w人已加入

描述

步骤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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分