Zaimplementowałem podstawową strukturę kolejki w C używając wskaźników void. Postępuje się, jak następuje:Implementacja kolejki C za pomocą void * - dobra lub zła praktyka?
- inicjowania struktury - ustawić wielkość zmiennej typu mają być przechowywane w kolejce
- push - przekazać wskaźnik zmiennej być przechowywane w kolejce, a następnie chwyta kopia dla siebie
- przód - struktura zwraca pustkę * do elementu z przodu. Mogę po prostu chwycić wskaźnik lub
memcpy()
, aby mieć kopię lokalną.
Sama struktura wygląda następująco:
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
};
początek i koniec są po prostu nieważne wskaźniki wskazujące na jakimś miejscu w aktualnie przydzielonego bloku pamięci. Jeśli wciśnie elementy w kolejce, zwiększam wskaźnik końcowy o varsize
. Jeśli pop(), po prostu zmniejszam wskaźnik końcowy również o varsize
.
Nie sądzę, że powinienem opublikować kod funkcji tutaj, to ponad 100 linii.
Pytanie: jest uważane za dobrą lub złą praktykę? Dlaczego nie)?
Uwaga: zdaję sobie sprawę, że istnieje wiele innych opcji dla kolejki w C. Po prostu pytam o jakość tego.
EDIT: Implementacja jest dostępna tutaj: http: // 89.70.149.19 /stuff/queue.txt (usuń spacje)
Użyj size_t dla rozmiarów pamięci –
Myślę, że dobrze napisać ogólny kod używając 'void *' –
@RanEldan Dziękuję, zrobię to. Poprawiono to tutaj. – szczurcio