如何调用参数由另一个函数生成的函数?



我正在使用Arduino和FastLED库控制一条LED,并且设置了一些功能,允许我更改LED等的颜色。

我有一个函数,其中传入红色、绿色和蓝色的值,并将整个条带设置为该颜色:

void changeColour(int valR, int valG, int valB) {
for (int i = 0; i < NUM_LEDS; i++) {
led[i] = CRGB(valR, valG, valB);
}
FastLED.setBrightness(255);
FastLED.show(); 
}

然后,我设置了一个预设颜色及其相应 RGB 值的二维数组:

int colours [20][3] = {
{255, 105, 180}, //HotPink
{255, 20, 147}, //DeepPink
{139, 0, 0}, //DarkRed
{255, 0, 0}, //Red
{255, 69, 0}, //OrangeRed
{255, 255, 0}, //Yellow
{128, 0, 0}, //Maroon
{50, 205, 50}, //LimeGreen
{0, 255, 0}, //Lime
{34, 139, 32}, //ForestGreen
{0, 128, 0}, //Green
{0, 100, 0}, //DarkGreen
{102, 205, 170}, //MediumAquaMarine
{0, 255, 255}, //Aqua
{0, 139, 139}, //DarkCyan
{0, 191, 255}, //DeepSkyBlue
{0, 0, 255}, //Blue
{128, 0, 128} //Purple
};

我想做的是调用changeColour();函数并从数组中传入随机颜色的 RGB 值,所以我编写了该函数:

int randomColour(); {
int x = rand() % 18;
int valR = colours[x][0];
int valG = colours[x][1];
int valB = colours[x][2];
return (valR, valG, valB);
}

我将如何获取它,以便我可以调用changeColour()函数,而不是changeColour(valR, valG, valB)它调用randomColour()函数,该函数反过来返回valR, valGvalB值,从而将它们传递到changeColour()函数中?

你的第一个问题是randomColour返回一个int,只有一个而不是3。

(valR, valG, valB),这使用逗号运算符,该运算符按顺序计算所有操作数(在本例中为 nop(,整个表达式计算到最后一个操作数,即valbB这就是您要返回的内容。

最简单和最合适的是为RGB颜色创建一个结构:

struct Rgb
{
int r;
int g;
int b;
};
void changeColour(Rgb color) {
for (int i = 0; i < NUM_LEDS; i++) {
led[i] = CRGB(color.r, color.g, color.b);
}
FastLED.setBrightness(255);
FastLED.show(); 
}
Rgb colours [20] = { /* ... */ };
Rgb randomColour() {
int x = rand() % 18;
return colours[x];
}

你想要的功能就是这样简单:

void changeToRandomColor()
{
changeColour(randomColour());
}

我还必须指出Arduino lib有自己的随机函数:https://www.arduino.cc/reference/en/language/functions/random-numbers/random/,我建议你考虑一下。

C++11 及更多都有可以使用的元组,但您还有其他选项可以执行此操作。

1 :您可以返回一个包含 r g b 值的结构,并从 randomColor(( 返回它。

2:更改 randomColor(( 以接受输出参数。

void randomColor(int &r, int &g, int &b) {
int x = rand() % 18;
r = colours[x][0];
g = colours[x][1];
b = colours[x][2];
}
void changeColor() {
int r, g, b;
randomColor(r, g, b);
std::cout << r << " " << g << "  " << b << std::endl;
}

3:颜色的最大值为255。因此,您可以简单地使用 4 字节整数来填充打包三个值并使用位操作将它们解压缩。 像这样的东西。

unsigned int randomColor() {
unsigned int r = 11;
unsigned int g = 22;
unsigned int b = 33;
return r << 16 | g << 8 | b;
}
void change_color() {
unsigned int rgb = randomColor();
unsigned int b = rgb & 0xFF;
unsigned int g = (rgb >> 8) & 0xFF;
unsigned int r = (rgb >> 16) & 0xFF;
}

返回结构是最简单、最干净的解决方案。

您不能从 C++ 中的函数返回多个值(那么容易(。您的randomColour函数实际上只返回一个值,valB,因为它是表达式(valR, valG, valB)中的最后一个值。

执行您要求的操作的一种简单方法是让randomColour指针返回到colours数组中,然后重载或更改changeColour以接受int数组。因此,与其在该函数内部使用valRvalGvalB,不如使用colorReference[0]colorReference[1]等。

最新更新