2

我对 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 根本不在stickyTriggers 数组中,因为它们不是粘性的。正如标题所示,我希望能够跳过索引,或使用任意 ID 作为键。大多数答案都忽略了这一点。

4

5 回答 5

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;
}
于 2013-09-23T19:23:02.150 回答
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;

}
于 2013-09-23T19:13:52.387 回答
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
    }
于 2013-09-23T19:13:11.673 回答
0

也许我应该省略 C++ 标签,只邀请 Arduino 特定的解决方案。但这是我发现的,它解决了我的问题:

Alexander Brevig 的 HashMap 库: 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。

于 2013-09-23T20:21:41.557 回答
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;
}
于 2013-09-24T15:29:17.070 回答