首页 > 解决方案 > 多维数组的使用

问题描述

我正在用 Arduino 构建一个红外遥控器。红外发射器的每个命令都存储为基于 RC-5 标准的逻辑信号的微秒延迟阵列。

例如:

// Command #1866: Command:$1865
// Protocol: RC5, Parameters: D=30U F=10U
const uint16_t repeat_Command__1865[] PROGMEM = { 889U, 889U, 1778U, 1778U, 889U, 889U, 889U, 889U, 889U, 889U, 1778U, 889U, 889U, 889U, 889U, 1778U, 1778U, 1778U, 1778U, 65535U };

因为我想首先检查哪些命令在我想控制的设备上工作,所以我想检查 RC5 标准中的每个可用命令。它的 5 位地址和 6 位命令导致我需要检查大约 2000 个命令。我使用一个名为 IRScrutinizer 的程序生成这些命令,当我给它设备地址 (1-15) 和命令 (1-63) 时,它会吐出微秒延迟。它生成上面的代码。我有办法通过脚本生成所有 2000 个命令。所以我有 2000 个数组,命名如下:repeat_Command_{Number of Command}

正如我现在所读到的,在 C++ 中没有简单的方法可以通过定义变量名称的变量来访问变量.....

所以我需要通过 for 循环中的所有命令来切换大小写,如下所示:

void loop() {
    Serial.println(F("Looping trough all Numbers"));
    for (int i = 0; i<1983;i++)
    {
      delay(1000)
    }
    switch (i) {
    case 1L:
        sendRaw(repeat_Command_, 24U, 36U);
        break;
    case 2L:
        sendRaw(repeat_Command__1, 22U, 36U);
        break;
    case 3L:
        sendRaw(repeat_Command__2, 24U, 36U);
        break;
.
.
.

但这会占用 Arduino 处理的大量内存。因为我使用 Progmem,所以问题只是 switch case 参数。

我的想法是将命令存储在多维数组中,然后在 forloop 中访问每个“行”。

但我该怎么做呢?

当我尝试:

const uint16_t commands[1][] PROGMEM = {1,2,3,4};

const uint16_t commands[2][] PROGMEM = {5,6,7,8};

这不起作用,我不希望它,但我不知道我的阵列方式足以做到这一点。

我收到一个错误:

declaration of 'commands' as multidimensional array must have bounds for all dimensions except the first

问题是每个命令的长度不固定。

另一种方法是在 for 循环内使用微秒生成数组。但这是我宁愿不解决的另一个逻辑问题:D

标签: c++arduino

解决方案


看起来你对多维数组的语法感到困惑——你不能在这样的多个地方声明相同的东西并期望它们被组合起来。

您的简单测试用例必须这样编写:

const uint16_t commands[][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8}};

但这只有在所有命令的长度相同时才有效。(这是上面第二维中的 4。)二维数组存储在内存中的前一行之后,因此每一行的大小必须相同。

一种解决方案是将每个命令存储在其自己的数组中,然后您可以使用另外两个数组(或结构数组)来存储命令的长度以及指向它们的指针。


推荐阅读