我对C ++很新,遇到了问题。我试图改变某个浮点值,用于定义一个元素的RGBA。问题是当我尝试更改浮动的值时发生错误。这是一个例子:
float ColorForScrollbar[4] = {1,0,0,.8};
// Set the value for ColorForScrollbar
// Attempt to change #1:
ColorForScrollbar[4] = {0,1,0,.8};
// Trying to change value of ColorForScrollbar, this doesn't
// work though, it returns an error saying:
// "Error: Expected an expression"
// Attempt to change #2:
ColorForScrollbar = {0,1,0,.8};
// This also doesn't work, it returns the error:
// "Error: Expression must be a modifiable value"
任何帮助都没有"尝试改变#1"也没有"尝试改变#2"工作
答案 0 :(得分:2)
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::vector
,std::array
)可能取决于你正在做什么。
答案 1 :(得分:-1)
数组实际上只是一个连续的,固定的内存区域的地址。您不能更改它,只能更改自己的街道地址(当然,除非您移动)。
然而,你可以改变的是数组的内容:
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];