Назначить несколько значений для массива в C - PullRequest
28 голосов
/ 21 августа 2010

Есть ли способ сделать это в сжатой форме?

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;

Что-то вроде coordinates = {1.0f, ...};?

Ответы [ 7 ]

26 голосов
/ 21 августа 2010

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

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

 return coordinates; 
10 голосов
/ 21 августа 2010

Старо-школьный путь:

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;
10 голосов
/ 21 августа 2010

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

т.е..

struct foo {
  GLfloat arr[10];
};
...
struct foo foo;
foo = (struct foo) { .arr = {1.0, ... } };
3 голосов
/ 21 августа 2010

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

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

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

3 голосов
/ 21 августа 2010

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

GLfloat coordinates[8] = {1.0f, ..., 0.0f};
0 голосов
/ 13 июня 2018

Если вы часто выполняете эти же задания в своей программе и хотите использовать ярлык, самым простым решением может быть просто добавить функцию

static inline void set_coordinates(
        GLfloat coordinates[static 8],
        GLfloat c0, GLfloat c1, GLfloat c2, GLfloat c3,
        GLfloat c4, GLfloat c5, GLfloat c6, GLfloat c7)
{
    coordinates[0] = c0;
    coordinates[1] = c1;
    coordinates[2] = c2;
    coordinates[3] = c3;
    coordinates[4] = c4;
    coordinates[5] = c5;
    coordinates[6] = c6;
    coordinates[7] = c7;
}

, а затем просто вызвать

GLfloat coordinates[8];
// ...
set_coordinates(coordinates, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f);
0 голосов
/ 13 июня 2018
typedef struct{
  char array[4];
}my_array;

my_array array = { .array = {1,1,1,1} }; // initialisation

void assign(my_array a)
{
  array.array[0] = a.array[0];
  array.array[1] = a.array[1];
  array.array[2] = a.array[2];
  array.array[3] = a.array[3]; 
}

char num = 5;
char ber = 6;

int main(void)
{
  printf("%d\n", array.array[0]);
// ...

  // this works even after initialisation
  assign((my_array){ .array = {num,ber,num,ber} });

  printf("%d\n", array.array[0]);
// ....
  return 0;
}
...