我想有一个允许不同大小的多维数组。 例如:
int x[][][] = {{{1,2},{2,3}},{{1,2}},{{4,5},{2,7},{1,1}}};
这些值将在编译时知道,不会更改。 我希望能够访问val = x [2] [0] [1];
等值最好的方法是什么?我已经习惯了java / php,这样做很简单。 感谢
答案 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。