我想要一个允许不同大小的多维数组。 示例:
int x[][][] = {{{1,2},{2,3}},{{1,2}},{{4,5},{2,7},{1,1}}};
这些值将在编译时已知并且不会改变。 我希望能够访问像 val = x[2][0][1]; 这样的值;
解决此问题的最佳方法是什么?我习惯了 java/php,在这里做这样的事情是微不足道的。 谢谢
最佳答案
我想你可以用“老式的(双向上坡)方式”来做到这一点:
#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
当然,它不会阻止您访问无效的数组元素 - 这样做会产生段错误(因为 x
中未使用的元素可能是无效指针)。
关于c++ - 使用Arduino的不同大小的多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20257486/