Ho implementato una struttura di coda di base in C usando i puntatori void. La procedura è come segue:Implementazione della coda C usando void * - buona o cattiva pratica?
- inizializzazione della struttura - ho impostato la dimensione del tipo variabile da memorizzare nella coda
- spinta - passo il puntatore alla variabile da memorizzare, la coda afferra quindi una copia per sé
- anteriore - la struttura restituisce un vuoto * all'elemento in primo piano. Potrei semplicemente prendere il puntatore o
memcpy()
per avere una copia locale.
La struct sé assomiglia a questo:
struct queue
{
void* start; //pointer to the beginning of queue
void* end; //-||- to the end
size_t memsize; //size of allocated memory, in bytes
size_t varsize; //size of a single variable, in bytes
void* initial_pointer; //position of the start pointer before pop() operations
};
inizio e la fine sono solo puntatori void che puntano a una certa posizione all'interno del blocco di memoria attualmente allocata. Se spingo gli elementi in coda, incremento il puntatore finale di varsize
. Se pop(), decremento del puntatore finale anche da varsize
.
Non penso che dovrei pubblicare il codice delle funzioni qui, sono oltre 100 righe.
La domanda: è considerata una buona o una cattiva pratica? Perchè no)?
Nota: sono consapevole che ci sono molte altre opzioni per una coda in C. Sto solo chiedendo la qualità di questo.
EDIT: L'implementazione è disponibile qui: http: // 89.70.149.19 /stuff/queue.txt (rimuovere gli spazi)
Usa size_t per la memoria di dimensioni –
penso che il suo bene di scrivere codice generico utilizzando '' void * –
@RanEldan Grazie, lo farò. Corretto qui – szczurcio