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回再宣言していることに気づきましたが、他の方法を試してみたところ、他のエラーが発生しました。

フラグの単純な配列を保持する正しい方法は何ですか? 配列の長さをハードコードすることなく、キーを検索して true または false (または null) を取得できるようにしたいと考えています。私はそれがすべて可能だと確信していますが、簡単な方法はありますか?

ありがとう

明確化: ここで重要なのは、トリガー 4 ~ 8 はスティッキーではないため、stickyTriggers 配列にまったく含まれていないことです。タイトルが示すように、インデックスをスキップしたり、任意の ID をキーとして使用したりできるようにしたいと考えています。ほとんどの答えはこれを見逃しています。

4

5 に答える 5

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

これを使用できるかもしれませんが、スティッキーでないトリガーへの参照を持たないという希望を完全には満たしていませんが、高速であり、256 のトリガーをマップするために 64 バイトのメモリしか使用しません。

私はすでにそれをシングルブールモードで持っていたので、2つのマップを作成するように調整し、質問に合うように名前を変更しました..

基本的にはビットマップです。

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 に答える
0

Arduino 固有のソリューションのみを招待するには、C++ タグを除外する必要があったかもしれません。しかし、これが私が見つけたもので、私の問題を解決します:

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 に答える