PDA

Visualizza la versione completa : [C] Perchè una struttura deve conoscere la propria grandezza?


XWolverineX
18-10-2006, 16:10
In varie strutture delle API di win32, molte volte vi è un dato membro chiamato size che indica la grandezza della struttura, e, di solito è sufficiente scrivere sizeof(struttura)
ma perchè dobbiamo specificare proprio noi la grandezza della struttura? non può essere...autodeterminante? ossia questo sizeof non se l

MItaly
18-10-2006, 16:37
Quel membro delle strutture ha ragione di essere per più motivi; innanzitutto tu passi alle API un puntatore a struttura, per cui non possono ricavare le dimensioni della struttura in questione. Inoltre in base alla dimensione molte funzioni sono in grado di capire se i puntatori in essa contenuti sono a 16, 32 o 64 bit. Ad ultimo, le strutture in un prossimo futuro potrebbero essere ingrandite aggiungendo nuovi membri, per cui le API in base alla dimensione potranno determinare quale versione della struttura si sta passando.

XWolverineX
19-10-2006, 19:01
questo ok ma continua a non quadrare...Mettiamo questo esempio



WNDCLASSEX wc;
wc.size = sizeof(WNDCLASSEX);
//altri parametri

RegisterClassEx(&wc);


Invece di fare in questo modo non potrebbe fare da solo cosi...



WNDCLASSEX wc;
//parametri
RegisterClassEx(&wc);

e poi nella funzione RegisterClassEx


ATOM RegisterClassEx(WNDCLASSEX *ppWc)
[
int size = sizeof(WNDCLASSEX);

]


Oppure invece di fare int size fa quello che gli pare....

MItaly
19-10-2006, 19:25
L'operatore sizeof viene valutato al momento della compilazione, per cui in RegisterClassEx restituirebbe le dimensioni dell'ultima versione della struttura con puntatori a 32 bit, mentre magari l'applicazione chiamante è stata compilata con una versione precedente della struttura.

XWolverineX
19-10-2006, 19:46
Originariamente inviato da MItaly
L'operatore sizeof viene valutato al momento della compilazione, per cui in RegisterClassEx restituirebbe le dimensioni dell'ultima versione della struttura con puntatori a 32 bit, mentre magari l'applicazione chiamante è stata compilata con una versione precedente della struttura.


Aaaah ecco adesso quadra...
Il codice con RegisterClassEx, anche se la struttura variasse, porterebbe sempre lo stesso numero di bytes

Xadoom
19-10-2006, 20:07
Mitici, da sempre mi sono posto lo stesso quesito pensando non ci fosse un motivo preciso.... :ciauz:

MItaly
19-10-2006, 20:07
Originariamente inviato da XWolverineX
Aaaah ecco adesso quadra...
Il codice con RegisterClassEx, anche se la struttura variasse, porterebbe sempre lo stesso numero di bytes
Esatto.

XWolverineX
19-10-2006, 20:31
Che geni che sono...
io per utilizzare le api sto morendo e loro vanno a pensare ste cose...
avessi un decimo della loro sapienza col C

MItaly
19-10-2006, 22:27
Be', anche nelle API ci sono dei begli obbrobri... in quelle della shell in particolare (vedi ShellExecute).

XWolverineX
20-10-2006, 09:19
Perchè, cosa ha che non va

Loading