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 11. Práce se soubory a vytvořit datovou strukturu schopnou popsat knihovnu s různými typy tiskovin.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
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;
}