Is there any way to do this in a condensed form?
GLfloat coordinates[8];
...
coordinates[0] = 1.0f;
coordinates[1] = 0.0f;
coordinates[2] = 1.0f;
coordinates[3] = 1.0f;
coordinates[4] = 0.0f;
coordinates[5] = 1.0f;
coordinates[6] = 0.0f;
coordinates[7] = 0.0f;
return coordinates;
Something like coordinates = {1.0f, ...};
?
Если вам действительно нужно присвоить значения (в отличие от инициализировать), вы можете сделать это следующим образом:
GLfloat coordinates[8];
static const GLfloat coordinates_defaults[8] = {1.0f, 0.0f, 1.0f ....};
...
memcpy(coordinates, coordinates_defaults, sizeof(coordinates_defaults));
return coordinates;
Старый способ:
GLfloat coordinates[8];
...
GLfloat *p = coordinates;
*p++ = 1.0f; *p++ = 0.0f; *p++ = 1.0f; *p++ = 1.0f;
*p++ = 0.0f; *p++ = 1.0f; *p++ = 0.0f; *p++ = 0.0f;
return coordinates;
Точно, вы почти поняли:
GLfloat coordinates[8] = {1.0f, ..., 0.0f};
Есть уловка, позволяющая обернуть массив в структуру (которая может быть инициализирована после объявления).
т.е.
struct foo {
GLfloat arr[10];
};
...
struct foo foo;
foo = (struct foo) { .arr = {1.0, ... } };
Вы можете использовать:
GLfloat coordinates[8] = {1.0f, ..., 0.0f};
, но это инициализация во время компиляции - вы не можете использовать этот метод в текущем стандарте для повторной инициализации (хотя я думаю, что есть способы сделать это в готовящемся стандарте, что может не сразу вам помочь).
Два других способа, которые приходят на ум, - это удалить содержимое, если оно исправлено:
GLfloat base_coordinates[8] = {1.0f, ..., 0.0f};
GLfloat coordinates[8];
:
memcpy (coordinates, base_coordinates, sizeof (coordinates));
или предоставить функцию, которая в любом случае выглядит как ваш код инициализации:
void setCoords (float *p0, float p1, ..., float p8) {
p0[0] = p1; p0[1] = p2; p0[2] = p3; p0[3] = p4;
p0[4] = p5; p0[5] = p6; p0[6] = p7; p0[7] = p8;
}
:
setCoords (coordinates, 1.0f, ..., 0.0f);
с учетом этих эллипсов (. ..
) являются заполнителями, а не вещами, которые нужно буквально вставлять в код.