Assign multiple values to array in C

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, ...};?

28
задан Michael Mrozek 20 August 2010 в 22:58
поделиться

5 ответов

Если вам действительно нужно присвоить значения (в отличие от инициализировать), вы можете сделать это следующим образом:

 GLfloat coordinates[8]; 
 static const GLfloat coordinates_defaults[8] = {1.0f, 0.0f, 1.0f ....};
 ... 
 memcpy(coordinates, coordinates_defaults, sizeof(coordinates_defaults));

 return coordinates; 
26
ответ дан 28 November 2019 в 03:06
поделиться

Старый способ:

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;
11
ответ дан 28 November 2019 в 03:06
поделиться

Точно, вы почти поняли:

GLfloat coordinates[8] = {1.0f, ..., 0.0f};
4
ответ дан 28 November 2019 в 03:06
поделиться

Есть уловка, позволяющая обернуть массив в структуру (которая может быть инициализирована после объявления).

т.е.

struct foo {
  GLfloat arr[10];
};
...
struct foo foo;
foo = (struct foo) { .arr = {1.0, ... } };
11
ответ дан 28 November 2019 в 03:06
поделиться

Вы можете использовать:

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);

с учетом этих эллипсов (. .. ) являются заполнителями, а не вещами, которые нужно буквально вставлять в код.

4
ответ дан 28 November 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: