我可以有一个跳过索引的布尔值的单维数组吗?
Can I have a single-dimension array of booleans that skip indexes?
我对Arduino编程很陌生,但是我已经掌握了窍门。我有一个非常强大的PHP和Javascript背景,所以这就是我的来历。
我一直在做一个带有LCD触摸屏的项目,上面有按钮网格,我希望其他开发人员可以根据他们的需求进行定制。有一个数组,开发人员可以自由添加项目,并且动态添加其他按钮页面。单击一个按钮只是将该按钮的索引发送到接收器。
现在我想让一些按钮"粘性",这样它们就会一直亮到关闭。我的想法是设置一个简单的布尔数组,如下所示:
boolean stickyTriggers[1] = 1;
boolean stickyTriggers[2] = 0;
boolean stickyTriggers[3] = 0;
boolean stickyTriggers[9] = 1;
我期望的是按钮 1、2、3 和 9 是粘性的,按钮 1 和 9 默认是"打开"的。我想当我渲染按钮时,我可以简单地说:
if (stickyTriggers[i]) {
// highlight button
}
我在编译时遇到的错误是:
array must be initialized with a brace-enclosed initializer
我有点意识到我在这里重新声明变量 3 次,但我尝试了其他方法并遇到了其他错误。
保存简单标志数组的正确方法是什么?我希望能够查找键并获得真或假(或空),而无需硬编码数组长度。我相信这一切都是可能的,但是有没有简单的方法?
谢谢
澄清:这里的关键是触发器 4-8 根本不在 stickyTrigger 数组中,因为它们不是粘性的。我希望能够跳过索引,或使用任意 ID 作为键,正如标题所暗示的那样。大多数答案都忽略了这一点。
我认为你需要这样的东西
#include <iostream>
using namespace std;
int main()
{
bool b[5] = {true, false, true, false, true};
cout << "Hello World" << endl;
for (int i=0; i < 5; i++) {
if (b[i]) {
cout<< "Index " << i << " is true" <<endl;
} else {
cout<< "Index " << i << " is false"<<endl;
}
}
return 0;
}
试试这个:
#define ARRAY_SIZE 10
#define BOOL unsigned int
#define TRUE 1
#define FALSE 0
int main()
{
BOOL stickyTriggers[ARRAY_SIZE] = { FALSE };
stickyTriggers[1] = TRUE ;
stickyTriggers[9] = TRUE ;
return 0;
}
是的,您正在多次重新定义数组。
在C++中,您可能想使用bitset
,请检查此链接
http://en.cppreference.com/w/cpp/utility/bitset
您也可以尝试矢量(可以动态更改其大小),如下所示
#include<iostream>
#include<vector>
using namespace std;
enum trigger_status {ON, OFF, NON_STICKY};
int main(){
vector<trigger_status> sticky_triggers(251, trigger_status::OFF); // you can add element to it dynamically, default all to off
sticky_triggers[0] = trigger_status::ON;
sticky_triggers[9] = trigger_status::ON;
sticky_triggers.push_back(trigger_status::ON); // sticky_triggers[251] = true, now u have 252 elements
}
也许我应该省略C++标签,只邀请特定于Arduino的解决方案。但这是我发现的,它解决了我的问题:
Alexander Brevig的HashMap Library:http://playground.arduino.cc/Code/HashMap
正如这里讨论的: http://forum.arduino.cc/index.php?PHPSESSID=q7rt05n43aa4enp6hepri50pi1&topic=42114.msg305435#msg305435
#include <HashMap.h>
const byte HASH_SIZE = 5;
HashType<int,boolean> hashRawArray[HASH_SIZE];
HashMap<int,boolean> hashMap = HashMap<int,boolean>(hashRawArray, HASH_SIZE);
void setup() {
Serial.begin(9600);
hashMap[0](1,true);
hashMap[1](2,false);
hashMap[2](3,false);
hashMap[3](4,false);
hashMap[4](9,true);
Serial.println(hashMap.getValueOf(1));
Serial.println(hashMap.getValueOf(2));
Serial.println(hashMap.getValueOf(9));
}
我可以添加一个快速包装器来将项目添加到 hashMap 中,而无需对索引进行硬编码,但这为我提供了一种简单的方法来设置布尔值的关联数组,使用任意整数作为键。
感谢您尝试所有人,抱歉,Arduino上没有一个答案有效。
你也许可以使用这个 它不能完全满足你不引用非粘性触发器的愿望,但它速度很快,只使用 64 字节的内存来映射出 256 个触发器。
我已经在单布尔模式下使用它,所以我调整它以制作两个地图并重命名它以适应您的问题。
基本上它是一个位图。
编译和测试在Arduino Duo上运行正常。
// bitmapped booleans
const int IntBits = 16;
const int NumTriggers = 256;
const int idxSticky = 0;
const int idxDown = 1;
unsigned int TriggerMap[NumTriggers/IntBits][2];
void setup() {
Serial.begin(9600);
clearTriggerMap; // set all to not sticky and not down
// tests
setStickyTrigger(1, true, true);
setStickyTrigger(2, true, false);
setStickyTrigger(3, true, false);
setStickyTrigger(9, true, true);
setStickyTrigger(30, true, true);
setStickyTrigger(128, true, true);
setStickyTrigger(255, true, true);
}
void loop() {
// tests
Test(0);
Test(1);
Test(2);
Test(3);
Test(9);
Test(30);
Test(128);
Test(255);
delay(5000);
}
void Test( int ATrigger) {
// testing
if (IsStickyTrigger(ATrigger)) {
Serial.print( "Trigger ");
Serial.print(ATrigger);
Serial.print(" is sticky");
if (IsStickyTriggerDown(ATrigger)) {
Serial.print(" and it is down");
}
}
Serial.println();
}
void clearTriggerMap() {
for (int i = 0; i < NumTriggers/IntBits; i++) {
for (int j = 0; j < 2; j++){
TriggerMap[i][j] = 0;
}
}
}
void setStickyTrigger(int AIndex, boolean ASticky, boolean IsDown) {
unsigned int o;
unsigned int b = 1;
o = AIndex / IntBits;
b = b << (AIndex % IntBits);
if (ASticky) {
TriggerMap[o][idxSticky] = TriggerMap[o][idxSticky] | b;
} else {
b = ~b;
TriggerMap[o][idxSticky] = TriggerMap[o][idxSticky] & b;
}
if (IsDown) {
TriggerMap[o][idxDown] = TriggerMap[o][idxDown] | b;
} else {
b = ~b;
TriggerMap[o][idxDown] = TriggerMap[o][idxDown] & b;
}
}
boolean IsStickyTrigger(int AIndex) {
unsigned int b = 1;
b = b << (AIndex % IntBits);
return (TriggerMap[AIndex / IntBits][idxSticky] & b) != 0;
}
boolean IsStickyTriggerDown(int AIndex) {
unsigned int b = 1;
b = b << (AIndex % IntBits);
return (TriggerMap[AIndex / IntBits][idxDown] & b) != 0;
}
- 指向多维数组C++的指针
- C++使用数组作为多维数组,尽管将其初始化为带有指针的 1D
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 使用递归模板动态分配的多维数组
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 为什么我们将单个或多维数组的大小声明为常量值?
- 如何在C++中获取二维数组中最少的一列数?
- 字符在多维数组中重复
- 如何将零填充的多维数组传递给 C++ 中的函数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 有效地计算多维数组的累积和?
- C++:交换矩阵的行:使用单维数组
- C++:矩阵高斯消除不起作用:使用单维数组来存储元素
- 我可以有一个跳过索引的布尔值的单维数组吗?