从函数中指向结构数组的C指针/引用
我在为Arduino创建库顶部的自定义函数时遇到问题 需要从函数从函数中指向结构数组的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
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);