Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

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;
}

courses/b0b99prpa/solutions/lab12.txt · Last modified: 2019/12/10 09:38 by viteks