====== 12. Seznam struktur ====== Idea možnosti, jak naplnit seznam položkami různých datových typů a zároveň mít k dispozici unifikovaný způsob přístupu k položkám. Kód by se dal kombinovat s příkladem [[courses:b0b99prpa:solutions:lab11|11. Práce se soubory]] a vytvořit datovou strukturu schopnou popsat knihovnu s různými typy tiskovin. #include #include #include typedef struct { void * data; void (*print)(void *); } record; typedef struct { int a; int b; } data_A; typedef struct { int a; char name[20]; } data_B; void print_A (void * a) { data_A * tmp = (data_A *)a; printf("A: %i %i\n", tmp->a, tmp->b); } record * construct_A (int a, int b) { data_A * data = malloc(sizeof(data_A)); data->a = a; data->b = b; record * tmp = malloc(sizeof(record)); tmp->data = data; tmp->print = print_A; return tmp; } void print_B (void * a) { data_B * tmp = (data_B *)a; printf("B: %i %s\n", tmp->a, tmp->name); } record * construct_B (int a, const char * b) { data_B * data = malloc(sizeof(data_B)); data->a = a; strcpy (data->name, b); record * tmp = malloc(sizeof(record)); tmp->data = data; tmp->print = print_B; return tmp; } int main() { record * seznam[3]; seznam[0] = construct_A (1, 100); seznam[1] = construct_B (2, "ahoj"); seznam[2] = construct_A (3, 6); for (int i = 0; i < 3; i++) seznam[i]->print (seznam[i]->data); // je treba uvolnit pamet ! return 0; }