Mam strukturę wykresu w C i chcę wykonać jej głęboką kopię (w tym węzły i krawędzie).Głęboka kopia struktury wykresu
struktura wygląda następująco:
struct li_list {
struct li_node n;
};
struct li_node {
struct li_node *next, *prev;
};
struct gr_graph {
struct li_list nodes;
int nodecount;
};
struct gr_node {
struct li_node node;
struct gr_graph *graph;
int pred_count, succ_count;
struct li_list pred, succ;
};
struct gr_edge {
struct li_node succ, pred;
struct gr_node *from, *to;
unsigned long marks;
};
te kodowanym nie istnieją jako siebie, ale „dziedziczona” w innej struktury, tak:
struct ex_node {
struct gr_node _; // "Superclass"
int id;
struct ex_node *union_find_parent;
...
}
Czy istnieje eleganckie rozwiązanie tworzenie głębokiej kopii takiej struktury, w tym aktualizowanie odniesień do kopii?
Uwaga: Członkowie zagnieżdżonych kodowanym nie wskazują na struktury korzenia zawiera, ale ich powiązanej zagnieżdżonej struktury (np ex_node._.pred.n.next
wskazuje na ex_edge._.pred
). Oznacza to arytmetykę żmudnego wskaźnika, gdy trzeba je zaktualizować.
Moje rozwiązanie do tej pory jest
- Memcopy wszystkie kodowanym
- iterację wszystkich kopiach
- połączeń grono makr dla wszystkich pól, które zawierają odniesienia (Z powodu braku RTTI w C, pewnie nie przyjdzie około tego)
- makra używać
offsetof
obliczyć adres struktury korzenia- Odzyskaj adres skopiowany odpowiednik
offsetof
aby punkt wskaźnik do prawidłowego zagnieżdżonej struktury
Czy istnieje łatwiejszy sposób to zrobić? Obawiam się również, że zapomniałem dodać makro, gdy dodam więcej pól.
Jak to jest lepsze niż rozwiązanie, które przedstawiłem? – Meinersbur
@Meinersbur: Myślałem, że "offsetof" ma na celu oszacowanie przesunięcia w bajtach do elementu struktury i zwrócenie liczby bajtów jako wartości size_t, więc nie jestem pewien, czy użycie przesunięcia jest sposobem, aby to zrobić .. .przy okazji, nie zgadzałem się z twoim rozwiązaniem, moją odpowiedzią jest abstrakcyjny widok tego, co robisz ... – t0mm13b