Sei sicuro che stai compilando lo stesso codice che hai postato qui?
Se il compilatore si lamenta in questa linea
p_data = &p_struct->DATA;
con un "membro struct/union previsto" messaggio, il compilatore è probabilmente rotto.
Nota, che &p_struct->DATA
è un'espressione perfettamente valida in C. Non c'è assolutamente alcun problema con questa espressione di per sé.
Il problema qui è che questo non è ciò di cui hai bisogno nel tuo caso. &p_struct->DATA
restituisce un puntatore all'intero array "DATA", cioè un puntatore del tipo unsigned char (*)[20]
. Stai tentando di assegnare questo valore a un puntatore di tipo unsigned char *
. Questo è illegale in C, poiché i tipi sono completamente diversi, ma tradizionalmente i compilatori C hanno risposto con un semplice avviso di "mancata corrispondenza di tipo" ed eseguito una conversione implicita (che, BTW, significa che il codice originale, anche se "sporco", dovrebbe funziona ancora come previsto).
Anche se qualche compilatore decide di contrassegnare questa mancata corrispondenza come un errore (che va bene), non dovrebbe comunque lamentarsi di alcun problema di tipo "struct/union member expected". Non ci sono problemi di questo tipo qui.
P.S. Come già detto, quello di cui hai veramente bisogno è p_data = &p_struct->DATA[0]
, ma questo non spiega ancora lo strano comportamento del tuo compilatore. Potrebbe essere che 'DATA' sia una macro definita da qualche parte prima della definizione 'clean_buffers'?
Aggiunto 19/10/2009: Nate, nel codice si accede all'array utilizzando un indice theCount
. Dato che stai comunque utilizzando l'accesso all'indice, non c'è davvero alcun motivo per creare il puntatore che stai tentando di creare. Il codice funziona perfettamente bene senza alcun ulteriore puntatore, basta acess il DATA
campo direttamente
theCount = 0;
while (p_struct->DATA[theCount] != 0) {
p_struct->DATA[theCount++] = 0;
(probabilmente sarei utilizzare un ciclo for
qui).
Se proprio insistete sulla creazione di questo puntatore e ancora utilizzando l'indice, il codice dovrebbe essere simile a quanto segue (le altre già suggerito che più di una volta)
p_data = p_struct->DATA; /* or &p_struct->DATA[0] */
...
theCount = 0;
while (p_data[theCount] != 0) {
p_data[theCount++] = 0;
Inoltre, si può optare per un altro variante "esotici" :)
unsigned char (*p_data)[20]; /* <- note: declared differently */
...
p_data = &p_struct->DATA; /* <- note: your original version */
...
theCount = 0;
while ((*p_data)[theCount] != 0) {
(*p_data)[theCount++] = 0;
Tuttavia, tornando a una versione unsigned char *p_data
, dal momento che a fare una puntatore, potrebbe avere più senso utilizzare una tecnica di "puntatore scorrimento" invece di utilizzare l'accesso dell'indice
unsigned char *p_data;
...
p_data = p_struct->DATA; /* or &p_struct->DATA[0] */
...
while (*p_data != 0) {
*p_data++ = 0;
Come sempre, è tutta una questione di preferenze personali. Naturalmente, nulla di tutto ciò funzionerà fino a quando non ti libererai di questa interferenza dalla macro.
Grazie per tutte le risposte, lo apprezzo. – Nate
Il messaggio di errore non ha senso. Che compilatore stai usando? – AnT