尝试更改浮点值时出错

Error when attempting to change value of float?

本文关键字:出错      更新时间:2023-10-16

试图更改用于定义元素的RGBA的某个浮点值。问题是,当我试图更改浮点值时,会发生错误。这里有一个例子:

float ColorForScrollbar[4] = {1,0,0,.8};
// Set the value for ColorForScrollbar
ColorForScrollbar[4] = {0,1,0,.8};
// "Error: Expected an expression"

ColorForScrollbar = {0,1,0,.8};
// "Error: Expression must be a modifiable value"
float ColorForScrollbar[4] = {1,0,0,.8};

这是有效的。{1,0,0,.8}初始值设定项。然而,这并不是一种表达。它只能在对象声明中的=之后使用。

ColorForScrollbar[4] = {0,1,0,.8};

如果这是合法的,那么它将(尝试)更改ColorForScrollbar[4]的值,而不是整个数组的值。由于存在的唯一元素具有索引0、1、2和3,因此这将具有未定义的行为。但是,{0,1,0,.8}不是一个表达式,因此它不能用于赋值的RHS。

这更接近了,但它和以前有同样的问题。此外,数组类型没有赋值运算符。

您可以一次更改一个元素:

ColorForScrollbar[0] = 0;
ColorForScrollbar[1] = 1;
ColorForScrollbar[2] = 0;
ColorForScrollbar[3] = 0.8;

或者,如果你想使用初始化器语法,你可以使用一个临时对象:

#include <cstring>
const float new_value[4] = { 0, 1, 0, 0.8 };
std::memcpy((void*)ColorForScrollbar, (void*)new_value), sizeof ColorForScrollbar);

然而,这一切都相当低级。您最好使用标准库中的一个C++容器类。哪一个最好(std::vectorstd::array)可能取决于你在做什么。

数组实际上只是一个连续的、固定的内存区域的地址。你不能改变它,就像你可以改变自己的街道地址一样(当然,除非你搬家)。

不过,您可以更改的是数组的内容:

ColorForScrollbar[0]=0;
ColorForScrollbar[1]=1;
ColorForScrollbar[2]=0;
ColorForScrollbar[3]=.8;

您不必更改数组中的每个值,只需更改需要更改的值即可。

你也可以做一个显式复制:

float NewColorForScrollBar[4] = {0,1,0,.8};
for (i=0; i<4; ++i)
    ColorForScrollbar[i]=NewColorForScrollbar[i];