我可以使用跳过索引的单维布尔数组吗?

时间:2013-09-23 19:07:57

标签: c++ arrays arduino

我对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作为键,如标题所示。大多数答案都错过了。

5 个答案:

答案 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

如此处所述: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。

答案 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;
}