/* * This code/software is licensed under the * CC-GNU GPL version 2.0 or later. * * see: http://creativecommons.org/licenses/GPL/2.0/ * * Author: Florian Streibelt * C-Kurs der Freitagsrunde, TU-Berlin September 2010 * */ #include #include #include typedef struct product_t { char *name; enum _punit { UNDEF,Pieces, KGrams, Liters} punit; union { struct{ int count; double price_per_piece; } ppiece; struct{ double weight; double price_per_kilo; } pkilo; struct { double liter; double price_per_liter; } pliter; }; } product; double calc_price(product *foo){ double sum=-1; printf("type: %i - ", foo->punit); switch (foo->punit){ default: printf ("ERROR.\n"); break; case KGrams: sum=(foo->pkilo.weight * foo->pkilo.price_per_kilo)/1000; break; case Pieces: sum=foo->ppiece.count * foo->ppiece.price_per_piece; break; case Liters: sum=foo->pliter.liter * foo->pliter.price_per_liter; break; } return sum; } int main(int argc, char** argv){ product *moo = (product*) calloc(sizeof(product),1); moo->name= (char*) calloc(sizeof(char),12); strcpy(moo->name,"Wirsingkohl"); moo->punit=KGrams; moo->pkilo.weight=812; moo->pkilo.price_per_kilo=1.29; double price = calc_price(moo); printf("price: %f \n",price); }