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

标签 c++ arduino

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

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/

相关文章:

c++ - 显示垂直于屏幕的四边形

c++ - Win32 C++ DLL 函数获取参数中的垃圾值

c++ - 如何使用 gmock 模拟构造函数和析构函数

arduino - wifi串口板和Arduino Uno板上的esp8266

c++ - C++读取串口设备的方法

c++ - 如何使用 OpenSSL 进行 AES 解密

c++ - 调用了 C 静态库,所有内容都包含在 extern "C"中,但它仍然无法正常工作

bash - 通过 Bash 打开与 Arduino 的串行连接

c++ - 迭代与将整数打印到字符LCD/OLED显示器的递归

c - 如何在 switch 语句中连续打印输出?