1

見てくれてありがとう!

バックグラウンド

私は、RGBアドレス指定可能なLEDのストリップを配置した各アームにクワッドコプターを構築しています。私はArduinoを使用してライトを駆動していますが、ArduinoのコードはC ++で、よく知らない言語です。

これは、このコードで発生した以前の問題に関して投稿した最初のStackOverflowの質問です。それは私が何をしようとしているのかについてのより多くの背景をあなたに与えます(あなたが興味を持っているなら)。

問題

最初の質問への回答のおかげで、配列「gpsHoldArr」を正しく記述できましたが、その値にアクセスできません。

以下のコードでtoggleLights(gpsHoldArr[x][y])は、のサブ配列を呼び出して渡しgpsHoldArrます。サブアレイは、特定のLEDストリップ([x])をポイントし、次に特定のステップ([y])をポイントした結果である必要があります。

toggleLights次に、渡された配列を反復処理し、オンになっている各LEDの値(1〜6の数値)とそのLEDの赤、緑、青の値をコンソールに送信する必要があります。

残念ながら、以下のコードを実行すると、次のエラーが発生します。 cannot convert int(*)[3] to int* for argument 1 to 'void toggleLights(int*)'

どんな助けでも大歓迎です。

現在のコードは次のとおりです。

//4 arms, 6 steps, 6 leds
int gpsHoldArr[4][6][6][3] = {
  {
    {{255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}}
},
  {
    {{255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}}
},
  {
    {{255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}}
},
  {
    {{255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}},
    {{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}}
}
};

toggleLights(gpsHoldArr[0][0]); //Toggles lights on strip #1, step #1
toggleLights(gpsHoldArr[1][0]); //Toggles lights on strip #2, step #1
toggleLights(gpsHoldArr[2][0]); //Toggles lights on strip #3, step #1
toggleLights(gpsHoldArr[3][0]); //Toggles lights on strip #4, step #1 

void toggleLights(int lights[]){
  for(int i = 0; i <= 6; ++i)
  {
    set_color_led(i, lights[i], lights[i], lights[i]);
  } 
}

void set_color_led(int led, int r, int g, int b){
   Serial.println(led); //Which LED (or "pixel") is it?
   Serial.println(r); //What is the red value?
   Serial.println(g); //What is the green value?
   Serial.println(b); //What is the blue value? 
}
4

3 に答える 3

2

私はおそらくこのようにそれについて行き、途中でいくつかの繰り返しを取り除きます。
(Arduinoのためだけのマクロトリック-デスクトップでは、配列の代わりにクラスを使用します。)

struct LED { int r, g, b; };

#define BLACK  {0, 0, 0}
#define RED    {255, 0, 0}

#define DEFAULT_LEDS \
  { {RED, BLACK, BLACK, BLACK, BLACK, BLACK},\
    {RED, RED,   BLACK, BLACK, BLACK, BLACK},\
    {RED, RED,   RED,   BLACK, BLACK, BLACK},\
    {RED, RED,   RED,   RED,   BLACK, BLACK},\
    {RED, RED,   RED,   RED,   RED,   BLACK},\
    {RED, RED,   RED,   RED,   RED,   RED}}

LED gpsHoldArr[4][6][6] = {
   DEFAULT_LEDS,
   DEFAULT_LEDS,
   DEFAULT_LEDS,
   DEFAULT_LEDS
};


void set_color_led(int index, const LED& led){
   Serial.println(index); //Which LED (or "pixel") is it?
   Serial.println(led.r); //What is the red value?
   Serial.println(led.g); //What is the green value?
   Serial.println(led.b); //What is the blue value? 
}

void toggleLights(LED (&leds)[6]){
  for(int i = 0; i < 6; ++i)  // You had a '<=' bug here.
  {
    set_color_led(i, leds[i]);
  } 
}

toggleLights(gpsHoldArr[0][0]); //Toggles lights on strip #1, step #1
于 2013-01-19T17:59:35.797 に答える
1

関数が1D配列(ポインターに減衰)が存在する場合、2D配列を渡します。

構造体/クラスを作成して配列の寸法を削除することを提案できますか?それにより、内容がより明確になります。

例えば

struct Led{
    int r,g,b;
};

void toggleLights(Led lights[]){

Led gpsHoldArr[4][6][6] = 

set_color_led(i, lights[i].r, lights[i].g, lights[i].b);

これですべての変更を行う必要があり、残りはそのまま機能するはずです。

さらに進んで、腕structとステップstructを作ることもできます。

于 2013-01-19T16:29:48.337 に答える
1

私はそれがあなたがしていると思うことをしているとは思いませんtoggleLights()。その入力は1次元配列ですが、サイズ[6][3]の2次元配列を渡しています。がtoggleLights(gpsHoldArr[0][0]);呼び出されると、関数が認識する1次元メモリ配列は{255,0,0,0,0,0}、つまり、配列の最初の6つの値になります。次に、これらの値のそれぞれについてset_color_led();、複数の引数に対して同じ値を呼び出して渡します。でループを展開するとtoggleLights()、これは次のように変換されます

// set_color_led(i, lights[i], lights[i], lights[i]) for i = {0, ..., 6}
set_color_led(0, 255, 255, 255);
set_color_led(1, 0, 0, 0);
set_color_led(2, 0, 0, 0);
set_color_led(3, 0, 0, 0);
set_color_led(4, 0, 0, 0);
set_color_led(5, 0, 0, 0);
set_color_led(6, 0, 0, 0); // bug here as noted by molbdnilo

これはおそらくあなたが望むものではありません。の定義をtoggleLights()次のように変更します。

void toggleLights(int lights[][3]){
  for(int i = 0; i < 6; ++i)
  {
    set_color_led(i, lights[i][0], lights[i][1], lights[i][2]);
  } 
}

この場合、を呼び出すとtoggleLights(gpsHoldArr[0][0]);、この関数が参照する2次元配列は次のようになります。

{{255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}}

ループを展開するとtoggleLights()、これは次の一連の関数呼び出しに変換されます。

// set_color_led(i, lights[i][0], lights[i][1], lights[i][2]) for i = {0, ..., 5}
set_color_led(0, 255, 0, 0);
set_color_led(1, 0, 0, 0);
set_color_led(2, 0, 0, 0);
set_color_led(3, 0, 0, 0);
set_color_led(4, 0, 0, 0);
set_color_led(5, 0, 0, 0);
于 2013-01-19T17:17:43.963 に答える