ВОПРОС, ОТВЕТНЫЙ НА КОНЕЦ СТРАНИЦЫ. ПОЛНОСТЬЮ РАБОЧИЙ КОД.
Здравствуйте, я хотел бы сделать в C то, что я просил в названии, однако я не знаю, как это сделать. Я сделал это на C ++ благодаря шаблонам, но а-ля C . Вот полнофункциональный код C ++: List.h (простая база данных)
* Интересно, смогу ли я эмулировать код с помощью указателей void? Проблема в том, что я видел ссылку, в которой говорится, что void * следует избегать, потому что это может вызвать больше проблем, чем решить.
По сути, это «умный массив», в котором хранятся указатели на сами переменные.
Если я знаю размер каждого указателя и размер каждой структуры, на которую указывают, простые malloc и reallocs должны работать правильно?
typedef struct
{
void **list;
// internal
int last_item_index;
size_t element_size; // size of each pointer
int elements; // number of currently allocated elements
int total_size; // >= #elements so that we don't have to always call malloc
int tweak_request_size; // each time the list grows we add this # of elements
} List;
// a shot at an addCopy function
// it deepcopies the object you pass in
List_addCopy(List *db, void *ptr_to_new_element)
{
... // grow **list
// alloc and copy new element
db->list[db->last_item_index+1] = malloc(element_size); // WORKS?
// HOW TO COPY THE ELEMENT TO HERE IF IT IS A STRUCTURE FOR INSTANCE???
...
}
or
// a shot at an assign function
// (allocate the elements yourself then pass the pointer to the List)
List_assign(List *db, void *ptr_to_new_element)
{
db->List = realloc(db->List, element_size*(elements+tweak_request_size));
db->List[db->last_item_index+1] = ptr_to_new_element;
}
// Usage example
List db; // our database
struct funky *now = (funky*)malloc(sizeof(funky));
funky->soul = JamesBrown;
List_addCopy(db, funky);
if (list[0]->soul == JamesBrown)
puts("We did It! :D");
Если я выделю все снаружи и просто передам указатели в Список, я думаю, единственная проблема - пустота **.
Возможен ли List_add? Только с обратными вызовами, которые делают alloc элемента и / или копируют его?
Возможен ли List_assign? Я не хочу много работать и в конечном итоге получить ненадежное программное обеспечение.
Большое спасибо и извините за свертку в письменной форме: p