107 联合体简介

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

typedef union tagVxValue {
    int per;
    double val;
} VxValue;

#define REC_PER 0
#define REC_VAL 1
typedef struct tagVx {
    double max;
    int rec;
    VxValue vxv;
} Vx; 

typedef struct tagFlow {
    double q;
    double s;
    double vx; 
} Flow;

void set_flow(Flow *pf)
{
    if (pf)
        pf->q = pf->s * pf->vx;
}

void print_flow(Flow *pf)
{
    if (pf) {
        printf( "%15s: %.2f\n"
                "%15s: %.2f\n"
                "%15s: %.2f\n",
                "S", pf->s,
                "Vx", pf->vx,
                "Q", pf->q);
        printf("-------------------------\n");
    }   
}

int main(int argc, char *argv[])
{
    // vx1 & f1
    Vx vx1 = { 200, REC_PER, { .per = 25 } };
    Flow f1;
    f1.s = 0.1;
    f1.vx = vx1.rec ?
        vx1.vxv.val :
        (vx1.vxv.per / 100.0 * vx1.max);
    set_flow(&f1);
    print_flow(&f1);
    // vx2 & f2
    Vx vx2 = { 200, REC_VAL, { .val = 50 } };
    Flow f2;
    f2.s = 0.1;
    f2.vx = vx2.rec ?
        vx2.vxv.val :
        (vx2.vxv.per / 100.0 * vx2.max);
    set_flow(&f2);
    print_flow(&f2);
    // f1.q should equals f2.q
    assert(f1.q == f2.q);
    return 0;
}