我对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次,但我尝试了其他方法并遇到其他错误。
持有简单数组标志的正确方法是什么?我希望能够查找密钥并获得真或假(或null),而无需对数组长度进行硬编码。我确信这一切都是可能的,但有一种简单的方法吗?
由于
澄清:这里的关键是触发器4-8根本不在stickyTriggers数组中,因为它们不是粘性的。我希望能够跳过索引,或使用任意ID作为键,如标题所示。大多数答案都错过了。
答案 0 :(得分:1)
是的,你要多次重新定义数组。
在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
}
答案 1 :(得分:1)
试试这个:
#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;
}
答案 2 :(得分:1)
我认为你需要这样的东西
#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;
}
答案 3 :(得分:0)
也许我应该省略C ++标签,只邀请特定于Arduino的解决方案。 但这是我发现的,它解决了我的问题:
Alexander Brevig的HashMap库: http://playground.arduino.cc/Code/HashMap
#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。
答案 4 :(得分:0)
您可能能够使用它,但它并不能完全满足您对非粘性触发器的引用,但速度很快,只使用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;
}