2014-10-30 15 views
5
here is the code 

struct point_tag { 
     int x; 
     int y; 
}; 

typedef struct point_tag Point; 

int main(void) 
{ 
     Point pt[] = { {10,20}, {30, 40}, {50,60}}; 
     pt[0] = {100,200}; 
} 

Quando faccio pt[0] = {100, 200}, il compilatore continua a lamentarsi diPerché questa matrice di assegnazione della struttura non viene compilata?

error:expected expression before '{' token

Io davvero non capisco che anche se. L'espressione non è prima dell'operatore {assegnazione token (=)?

Non capisco perché l'assegnazione sarebbe un problema però. il valore all'indirizzo pt si riferisce a un array di Point. Sto solo impostando il Punto 0 come nuovo punto e so che assegnare una struttura in un formato come {100,200} è legale dove gli elementi all'interno di quell'array sono solo campi.

risposta

6

Per assegnazione, typecast il valore nel tipo Point per renderlo un compound literal:

pt[0] = (Point){100,200}; 

Live code usando gcc

Ciò equivale a

{ 
    Point temp = {100,200}; 
    pt[0] = temp; 
} 

P.S. Il letterale composto non è disponibile nel vecchio compilatore conforme C89. È disponibile in GCC per C89 come estensione e in C99 il literal composito è una caratteristica fondamentale.

+0

C'è un motivo per cui non devi farlo per {10,20}, {30,40} e {50,60}? Mi fa incazzare. Tecnicamente stai ancora assegnando quei valori al valore di quegli indici nell'array – committedandroider

+2

Perché il costrutto sopra è disponibile solo per l'inizializzazione. In 'pt [0] = (Punto) {100,200};', stai creando un 'Punto' temp e assegnandolo a' pt [0] '. Devi dire al compilatore se '{100, 200}' è un 'Point' o' int [2] 'o qualcos'altro. –

+0

ma questa non potrebbe essere una logica simile in quanto si sta creando anche un punto temporaneo {10,20} e lo si memorizza come valore del primo indice dell'array? – committedandroider

Problemi correlati