使用Arduino的不同大小的多维数组

时间:2013-11-28 04:04:18

标签: c++ arduino

我想有一个允许不同大小的多维数组。 例如:

int x[][][] = {{{1,2},{2,3}},{{1,2}},{{4,5},{2,7},{1,1}}};

这些值将在编译时知道,不会更改。 我希望能够访问val = x [2] [0] [1];

等值

最好的方法是什么?我已经习惯了java / php,这样做很简单。 感谢

2 个答案:

答案 0 :(得分:1)

我想你可以这样做“老式(上坡两路)”:

#include <stdio.h>
int main(void){
    int *x[3][3];
    int y[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
    x[0][0] = &y[0];
    x[0][1] = &y[2];
    x[1][0] = &y[4];
    x[2][0] = &y[6];
    x[2][1] = &y[8];
    x[2][2] = &y[10];
    // testing:
    printf("x[0][0][0] = %d\n", x[0][0][0]);
    printf("x[0][0][1] = %d\n", x[0][0][1]);
    printf("x[0][1][0] = %d\n", x[0][1][0]);
    printf("x[0][1][1] = %d\n", x[0][1][1]);
    printf("x[1][0][0] = %d\n", x[1][0][0]);
    printf("x[1][0][1] = %d\n", x[1][0][1]);
    printf("x[2][0][0] = %d\n", x[2][0][0]);
    printf("x[2][0][1] = %d\n", x[2][0][1]);
    printf("x[2][1][0] = %d\n", x[2][1][0]);
    printf("x[2][1][1] = %d\n", x[2][1][1]);
    printf("x[2][2][1] = %d\n", x[2][2][0]);
    printf("x[2][2][1] = %d\n", x[2][2][1]);
  return 0;
}

基本上,数组x有点太大(3x3),它指向包含数据的数组y中的“正确位置”(我使用数字1 ... 12因为它更容易看到它正在做正确的事情)。对于像这样的小例子,最终得到一个由x(72字节)中的9个指针组成的数组,以及y(48个字节)中的12个整数。

如果您在int数组中填充了不需要值的零(或-1,如果您想表示“无效”),则最终会得到18x4 = 72字节。所以上面的方法效率较低 - 因为这个数组不是“非常稀疏”。随着你改变粗糙程度,这会变得更好。如果你真的想要提高效率,你会得到一个指针数组,然后是n个指针数组 - 但这很快就会非常混乱。

通常,正确的方法是在速度和内存大小之间进行权衡(在Arduino上总是非常重要)。

顺便说一下 - 上面的代码确实产生了输出

x[0][0][0] = 1
x[0][0][1] = 2
x[0][1][0] = 3
x[0][1][1] = 4
x[1][0][0] = 5
x[1][0][1] = 6
x[2][0][0] = 7
x[2][0][1] = 8
x[2][1][0] = 9
x[2][1][1] = 10
x[2][2][1] = 11
x[2][2][1] = 12

当然它不会阻止你访问无效的数组元素 - 这样做会产生一个seg错误(因为x中未使用的元素可能是无效的指针)。

答案 1 :(得分:1)

感谢Floris。 我决定只将所有值加载到一个数组中,比如

{1,2,2,3,1,2,4,5,2,7,1,1}

并有第二个数组存储每个第一维的长度,如

{2,1,3}

第三个维度的长度总是2,所以我只是将数字乘以2.我将创建一个帮助类,所以我可以做一些像getX(2,0)这样会返回4的东西,还有另一个函数,比如getLength(0),返回2。