从函数中指向结构数组的C指针/引用

从函数中指向结构数组的C指针/引用,c,arrays,arduino,fastled,C,Arrays,Arduino,Fastled,我在为Arduino创建库顶部的自定义函数时遇到问题 需要从函数drawGradient内部更改LED阵列,以设置LED的颜色 函数的指针、引用和参数肯定有问题,但我似乎不知道该如何正确处理。如何正确使用这段代码的指针/引用 兴趣线 CRGB leds[NUM_LEDS]; void loop() { drawGradient(&leds, 4, 0, CRGB::White, CRGB::Lime); } void drawGradient(struct CRGB leds

我在为Arduino创建库顶部的自定义函数时遇到问题

需要从函数
drawGradient
内部更改LED阵列,以设置LED的颜色

函数的指针、引用和参数肯定有问题,但我似乎不知道该如何正确处理。如何正确使用这段代码的指针/引用

兴趣线

CRGB leds[NUM_LEDS];

void loop() {
    drawGradient(&leds, 4, 0, CRGB::White, CRGB::Lime);
}

void drawGradient(struct CRGB leds[], unsigned int from, unsigned int to, struct CRGB fromColor, struct CRGB toColor) {
    leds[j] = pickFromGradient(fromColor, fromColor, position);
}
完整代码

#include "FastLED.h"

#define NUM_LEDS 18

#define DATA_PIN 7

CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
}

void loop() {
  leds[4] = CRGB::Red;
  FastLED.show();

  delay(1000);

  drawGradient(&leds, 4, 0, CRGB::White, CRGB::Lime);
  drawGradient(&leds, 4, 8, CRGB::White, CRGB::Lime);
  drawGradient(&leds, 13, 9, CRGB::White, CRGB::Lime);
  drawGradient(&leds, 13, 17, CRGB::White, CRGB::Lime);

  FastLED.show();

  while(1); // Save energy :-)
}

void drawGradient(struct CRGB leds[], unsigned int from, unsigned int to, struct CRGB fromColor, struct CRGB toColor) {
  unsigned int barLength = abs(to - from) + 1;
  int rangePerPixel = 255/barLength;

  for(int i = 0; i <= barLength; i++) {
    int j = 0;
    if(from < to) {
      j = from + i;
    } else {
      j = max(from, to) - i;
    }

    float position = i / barLength;

    leds[j] = pickFromGradient(fromColor, toColor, position);
  }
}

struct CRGB pickFromGradient(struct CRGB fromColor, struct CRGB toColor, float position) {
  struct CRGB newColor;

  uint8_t r = fromColor.r + position * (toColor.r - fromColor.r);
  uint8_t g = fromColor.g + position * (toColor.g - fromColor.g);
  uint8_t b = fromColor.b + position * (toColor.b - fromColor.b);

  newColor.setRGB(r, g, b);

  return newColor;
}
#包括“FastLED.h”
#定义数_指示灯18
#定义数据_引脚7
CRGB发光二极管[NUM_发光二极管];
无效设置(){
快速发光。添加发光二极管(发光二极管,数量发光二极管);
}
void循环(){
发光二极管[4]=CRGB::红色;
fasted.show();
延迟(1000);
拉伸梯度(LED、4、0、CRGB::白色、CRGB::石灰);
拉伸梯度(LED、4、8、CRGB::白色、CRGB::石灰);
拉伸梯度(LED、13、9、CRGB::白色、CRGB::石灰);
拉伸梯度(LED、13、17、CRGB::白色、CRGB::石灰);
fasted.show();
while(1);//节能:-)
}
void drawGradient(结构CRGB指示灯[],无符号整型从,无符号整型到,结构CRGB从颜色,结构CRGB到颜色){
无符号int-barLength=abs(to-from)+1;
int rangePerPixel=255/条长;

对于(int i=0;i更改函数签名:

  void drawGradient(struct CRGB leds[], unsigned int from, unsigned int to, struct CRGB fromColor, struct CRGB toColor)

并按以下方式调用函数drawGradient:

  drawGradient(leds, 4, 0, CRGB::White, CRGB::Lime);

LED本身是CRGB结构数组的指针。&LED表示指针的地址。

使用相同的颜色调用pickFromGradient:

leds[j] = pickFromGradient(fromColor, fromColor, position);
应该是:

leds[j] = pickFromGradient(fromColor, toColor, position);

我的C有点生疏,但你不应该调用为
drawGradient(LED,…)
因为C数组是作为指向第一个元素(IIRC)的指针传递的吗?你使用
pickFromGradient(fromColor,fromColor,position)
但它看起来必须是
pickFromGradient(fromColor,toColor,position)
。这是一个很好的例子,iKiWiXz!修复了它,只是错过了它。如果可以的话,我会把它作为注释放在这里。:)
leds[j] = pickFromGradient(fromColor, toColor, position);