2010-08-20 17 views
24

¿Hay alguna forma de hacerlo en forma condensada?Asignar múltiples valores a la matriz en C

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; 

Algo así como coordinates = {1.0f, ...};?

+0

¿Desea devolver un puntero a una variable local, no? Algunas de las cosas que las personas han dicho en las respuestas/comentarios siguientes asumen que las variables involucradas son automáticas o que no lo son. Podría ayudar si especificas. –

+0

Una vez que se inicializa la estructura, no hay una manera fácil de asignar miembros en masa (aparte de hacer una copia de otra estructura con 'memcpy'). A menudo me encuentro deseando tener esta característica. – bta

+0

Creo que su respuesta original es la mejor: es intuitiva, aunque un poco prolija, pero eso no es una preocupación para los compiladores modernos. –

Respuesta

20

Si realmente a asigna valores (en contraposición a inicializar), puede hacerlo de esta manera:

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

return coordinates; 
+0

Esta es una buena idea, tal vez lo haga de esta manera. – UnstableFractal

+0

Mejor aún, conviértalo en "static const" y los compiladores pueden optimizar la variable directamente desde el código. –

+0

@Zan: ¡Buen punto! –

3

Exactamente, que casi lo consiguió:

GLfloat coordinates[8] = {1.0f, ..., 0.0f}; 
+0

¿Qué sucede si lo he hecho y quiero reasignarlo después? – UnstableFractal

+3

@smsteel Esa sintaxis solo se aplica a las declaraciones –

+0

Esto es malo. ¿Hay alguna otra forma de simplificarlo? :) – UnstableFractal

3

Usted puede usar:

GLfloat coordinates[8] = {1.0f, ..., 0.0f}; 

pero esta es una inicialización en tiempo de compilación: no puede usar ese método en el estándar actual para reinicializar (aunque creo que hay formas de hacerlo en el próximo estándar, que puede no serle de ayuda inmediata).

Las otras dos formas que vienen a la mente son a Blat los contenidos si están fijos:

GLfloat base_coordinates[8] = {1.0f, ..., 0.0f}; 
GLfloat coordinates[8]; 
: 
memcpy (coordinates, base_coordinates, sizeof (coordinates)); 

o proporcionar una función que tiene el código de inicialización de todos modos:

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

mantenimiento en mente, esas elipsis (...) son marcadores de posición, no cosas para insertar literalmente en el código.

4

Hay un truco para envolver la matriz en una estructura (que se puede inicializar después de la declaración).

es decir.

struct foo { 
    GLfloat arr[10]; 
}; 
... 
struct foo foo; 
foo = (struct foo) { .arr = {1.0, ... } }; 
+0

Oh, no lo necesitabas, solo funcionaría la inicialización simple. Ignora mi respuesta. – domen

+0

Puede hacer clic en "eliminar" en la esquina inferior izquierda de su publicación si lo desea.= P –

+2

Oh, bueno ... tal vez alguien lo encuentre útil :-) – domen

6

La forma de la vieja escuela:

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; 
Cuestiones relacionadas