dire che ho uno structpuntatori in una struct volatile C
typedef struct A{
int a1;
int *a2;
}A_t;
Ora, se io dichiaro un esempio di questo struct ad essere volatili -
volatile A_t trial;
e io uso un puntatore volatile per l'accesso questa struttura volatile.
volatile A_t *ptrToTrial = &trial;
Se provo a fare questo:
int *ptrToField = ptrToTrial->a2;
Dovrebbe ptrToField
essere volatili come bene? Il compilatore dovrebbe sapere che prtToField
è volatile senza menzione esplicita perché è accessibile tramite ptrToTrial
che è volatile?
anche se v'è una funzione -
function trialFunction(A_t *trialptr)
{
int *p = trialptr->a2;
}
Se chiamiamo questa funzione con PTR volatili sopra riportate -
trailFunction(ptrToTrial)
ottengo un errore: volatile A_t* is incompatible with parameter of type A_t
.
Quindi, se cambio la definizione della funzione per includere volatile
, non vedo un errore.
function trialFunction(volatile A_t *trialptr)
{
int *p = trialptr->a2;
}
Non dovrebbe il compilatore lamentano anche il puntatore p
- perché p
è non volatile e trialptr->a2
è volatile?
Il tuo codice non chiarisce come stai usando 'volatile'. Ma sappi che non fa quello che molti pensano che faccia. Infatti, [è praticamente inutile in realtà] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html). –
Solo le cose dichiarate esplicitamente come 'volatile' nello specificatore di tipo saranno volatili. Nel caso precedente, 'trial' e' * ptrToTrial' sono volatili. 'ptrTrial-> a2' è volatile in quanto membro di una struttura volatile. Tuttavia 'ptrToTrial-> a2 [0]' e 'ptrToField [0]' (supponendo che siano validi) non sono volatili. –
"E io uso un puntatore volatile per accedere a questa struttura volatile." 'volatile A_t * ptrToTrial = &trial;' -> No, 'ptrToTrial' non è' volatile', quello a cui punta è 'volatile'. – chux