PDA

View Full Version : [C] Strutture con campi assegnati con il punto


fbcyborg
23-09-2008, 17:14
Salve a tutti,

stavo vedendo un modulo del kernel di Linux che ha una struttura così definita:
static struct i2c_algorithm ov518_i2c_algo = {
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14)
.name = "OV518 algorithm",
.id = I2C_ALGO_SMBUS,
#endif
.smbus_xfer = ov518_smbus_xfer,
.algo_control = ov51x_i2c_control,
.functionality = ov518_i2c_func,
};

Sebbene capisco che si stanno facendo delle assegnazioni dentro una struttura dichiarata lì nel modulo, volevo sapere che significato ha il "punto" prima di functionality, di algo_control, ecc.
Inoltre, perché si fa così?

E' forse la stessa cosa che si fa dopo aver dichiarato una struttura, e tramite il nome della variabile di quel tipo si mette il punto e si assegnano i valori?

Ovvero:
ov518_i2c_algo.functionality = ov518_i2c_func; ??

Grazie.

Tommo
23-09-2008, 17:30
Perchè se non fosse ostico e cripitco non lo avrebbero messo nel kernel linux :asd:

Cmq bisogna notare che prima della graffa c'è un uguale, e che le assegnazioni sono terminate da , invece che da ;... per cui quella la non è una definizione, ma un assegnamento.
Il .comunque non so a che serva...

DanieleC88
23-09-2008, 17:49
Infatti non è una dichiarazione. Serve ad inizializzare solo certi campi (che nelle struct hanno un nome). Potrebbe essere una struct con 200 elementi e ne inizializzi solo il terzo (per esempio), se vuoi, con quella scrittura.

ciao ;)

fbcyborg
23-09-2008, 17:58
Ok, sul fatto che era una inizializzazione c'ero arrivato, ma quindi è una struttura dichiarata altrove? Ho visto che nel kernel (2.6.25) è definita in linux/i2c.h ma i campi non corrispondono.

Tipicamente io posso definire una una struttura in un file .h, poi in un mio file sorgente .c posso dichiararla come variabile, inizializzarla e usarla ecc..

Quando ci sono quei punti invece, che differenza c'è nell'utilizzo, a parte che è una inizializzazione di campi?

DanieleC88
23-09-2008, 18:06
Ok, sul fatto che era una inizializzazione c'ero arrivato, ma quindi è una struttura dichiarata altrove? Ho visto che nel kernel (2.6.25) è definita in linux/i2c.h ma i campi non corrispondono.
Ovvero? Quali sono le differenze?
Quando ci sono quei punti invece, che differenza c'è nell'utilizzo, a parte che è una inizializzazione di campi?
Che inizializzi al valore che vuoi tu solo taluni campi, gli altri sono azzerati:
#include <stdio.h>

struct prova
{
int primo;
int secondo;
int terzo;
};

int main()
{
struct prova P = { .secondo = 10 };

printf("P\n{\n\t.primo = %d;\n\t.secondo = %d;\n\t.terzo = %d;\n}\n", P.primo, P.secondo, P.terzo);
return 0;
}
Restituisce:
$ ./prova
P
{
.primo = 0;
.secondo = 10;
.terzo = 0;
}
Anche se, in verità, non so quanto sia standard:
gcc -W -Wall -ansi -pedantic main.c -o ./struct
main.c: In function 'main':
main.c:12: warning: ISO C90 forbids specifying subobject to initialize

fbcyborg
23-09-2008, 18:09
Grazie è chiarissimo l'esempio. Ora non ho più dubbi! :)