2010-08-20 16 views
24

Esiste un modo per fare questo in forma sintetica?Assegnare valori multipli a matrice in 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; 

Qualcosa come coordinates = {1.0f, ...};?

+0

State restituendo un puntatore a una variabile locale, là? Alcune delle cose che le persone hanno detto nelle risposte/commenti sottostanti presuppongono che le variabili coinvolte siano quelle automatiche o che non lo siano. Potrebbe aiutare se si specifica. –

+0

volta struct viene inizializzato, non v'è un modo semplice per i membri massa assegnazione (altro che fare una copia di un altro struct con 'memcpy'). Spesso mi trovo a desiderare di avere questa caratteristica. – bta

+0

Penso che la tua risposta originale è la migliore - è intuitivo, anche se un po 'prolisso, ma che non è una preoccupazione per i compilatori moderni. –

risposta

20

Se davvero a assegnare valori (al contrario di inizializzazione), si può fare in questo modo:

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

Questa è una buona idea, forse lo farò in questo modo. – UnstableFractal

+0

Meglio ancora, rendilo "const statico" ei compilatori possono ottimizzare la variabile fin dal codice. –

+0

@Zan: buon punto! –

3

Esattamente, è quasi capito bene:

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

E se l'avessi fatto e volessi riassegnarlo dopo? – UnstableFractal

+3

@smsteel Che sintassi si applica solo alle dichiarazioni –

+0

Questo è male .. C'è un altro modo per semplificare? :) – UnstableFractal

3

È può usare:

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

ma questa è un'inizializzazione in fase di compilazione - non è possibile utilizzare il metodo che nello standard corrente di ri-inizializzazione (anche se penso che ci sono modi per farlo nella norma cui è decisivo, che non può immediatamente aiutarvi).

Gli altri due modi che vengono in mente sono a blat i contenuti se sono fissati:

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

o fornire una funzione che si presenta come il codice di inizializzazione in ogni caso:

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

keeping queste ellissi (...) sono segnaposto, non cose da inserire letteralmente nel codice.

4

C'è un trucco per avvolgere l'array in una struttura (che può essere inizializzato dopo la dichiarazione).

ie.

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

Oh, non ne avevi bisogno, sarebbe stata solo una semplice inizializzazione. Ignora la mia risposta. – domen

+0

Se vuoi, puoi fare clic su "Elimina" nella parte in basso a sinistra del tuo post.= P –

+2

Oh, beh ... forse qualcuno lo trova utile :-) – domen

6

alla vecchia scuola:

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;