c++ - 多维数组的使用
问题描述
我正在用 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
解决方案
看起来你对多维数组的语法感到困惑——你不能在这样的多个地方声明相同的东西并期望它们被组合起来。
您的简单测试用例必须这样编写:
const uint16_t commands[][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8}};
但这只有在所有命令的长度相同时才有效。(这是上面第二维中的 4。)二维数组存储在内存中的前一行之后,因此每一行的大小必须相同。
一种解决方案是将每个命令存储在其自己的数组中,然后您可以使用另外两个数组(或结构数组)来存储命令的长度以及指向它们的指针。
推荐阅读
- python - 使用 Keras 和 Tensorflow 的自定义层
- css - SharePoint - 具有 RTF 格式的 CSS 列
- spring - 我在创建产品时遇到了一个错误,当它显示类别类型时,它给了我一个文件的位置
- python - 在opencv python中绘制多边形的问题
- mysql - SQL 在全名中搜索姓氏
- python - 如何使用 Beautiful Soup 有效地抓取多个页面?
- ios - 通过应用商店获取带有深度链接 url 的参考代码
- csv - 在 Jmeter 中是否有可能基于当前的 csv 行我可以决定调用哪个端点?
- javascript - 防止 Swiper Slide 在点击事件上移动
- api - 从 stat group telegram api 的响应中制作图表