这是我的代码片段:
typedef float point2[2];
point2 a = {-90, -90};
point2 b = {-90, 90};
point2 c = {90, 90};
point2 d = {90, -90};
glBegin(GL_POLYGON);
glVertex2fv(a);
glVertex2fv(b);
glVertex2fv(c);
glVertex2fv(d);
glEnd();
这很顺利。但后来当我尝试将新值写入这些数组时,例如:
a = {-66, -66};
b = {-66, 66};
我在这里得到一个错误:
error: assigning to an array from an initializer list
我理解,在声明后我无法直接将值赋给数组。但这应该是怎样的呢?
答案 0 :(得分:3)
您无法使用初始化列表分配给数组。但是如果你使用std::array
而不是C数组,那么这是可能的:
#include <array>
typedef std::array<float, 2> point2;
point2 a = {-90.0, -90.0};
a = {-66, -66};
你仍然可以将它传递给像glVertex2fv
这样的函数,它使用std::array::data
获取指向数组的指针:
glVertex2fv(a.data());
答案 1 :(得分:2)
在这些语句中,您没有为数组赋值,而是在初始化该数组。更改数组中的值可以这样做:
a[0] = -66;
a[1] = -66;
答案 2 :(得分:2)
初始化数组后,您无法使用初始化列表,只需执行:
a[0] = -66;
a[1] = -66;
答案 3 :(得分:2)
当你的案例真正涉及平原中的点时,你应该更喜欢使用类而不是数组。
class point2 {
private:
float x_;
float y_;
public:
point2(const float x, const float y):
x_{x}, y_{y} {};
point2(const point2& o):
x_{o.x_}, y_{o.y_} {};
operator = (const point2& o) {
x_ = o.x_;
y_ = o.y_;
}
// ...
};
point2 a = {90.0, 90.0}; // initialize a
a = {45.0, 45.0}; // untested, should work
a = point2{45.0, 45.0} // will work.
如您所见,这将为您提供更自然,更富有表现力的界面。这样的接口总是提高可读性和可维护性。
答案 4 :(得分:1)
仅在初始化期间可以这样做。 使用:
a[0]= - 66;
a[1] = -66;
但是,您可以创建临时数组,然后将其复制。
point2 tmp = {-66, -66 }
System.arraycopy( tmp, 0, a, 0, src.length );
但对于这样的任务来说,这看起来有点过分了。
答案 5 :(得分:1)
a[0] =-66;
a[1]=-66;