我可以有一个跳过索引的布尔值的单维数组吗?

Can I have a single-dimension array of booleans that skip indexes?

本文关键字:单维 数组 布尔值 我可以 索引 有一个      更新时间:2023-10-16

我对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;
}