如何调用参数由另一个函数生成的函数?
How can I call a function where the argument is produced by another function?
我正在使用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, valG
和valB
值,从而将它们传递到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
数组。因此,与其在该函数内部使用valR
、valG
、valB
,不如使用colorReference[0]
、colorReference[1]
等。
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- 如何在qt中从另一个类调用函数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 将 N-arg 函数包装到另一个函数中
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- C++从另一个函数退出函数
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 在一个类中使用另一个类中的函数,而不在 c++ 中使用继承
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?