C指针而不是联合

时间:2015-01-27 11:34:53

标签: c pointers unions

我有一个嵌入式系统,应根据其状态存储不同的结果集。

一种可能的解决方案是使用联合:

typedef struct
{
    union
    {
        struct 
        {
            double  Val1;
            double  Val2;
        } State1;

        struct
        {
            double  Val3;
        } State2;
    };
} strBuf;
strBuf Buf;

现在我可以使用这些函数存储值(我可以通过函数指针调用它来切换测量类型):

void meas1(strRes* res)
{
    Buf.State1.Val1 = res->v1;
    Buf.State1.Val2 = res->v2;
}

void meas2(strRes* res)
{
    Buf.State2.Val3 = res->v1;
}

我们的想法是根据测量结果使用State1或State2。

我认为union结构是一种可靠的方式,因为在分配内存时我不会犯错误。 缺点是在State2中不必要地使用内存。 另一个缺点是可以访问错误的变量。

但出于好奇:我如何用指针做到这一点? 您建议的解决方案的优缺点是什么?

编辑:

系统每100 ms生成一次值。这些都是在RX210上处理的。

第一个状态从两个双精度数d1 [n],d2 [n]和先前的值d1 [n-1],d2 [n-1]计算如下: m = log2(d1 [n] / d1 [n-1])/ log2(d2 [n] / d2 [n-1]) (我想log2是最快的日志)

第二个状态仅计算两个双打的比率: p = d1 [n] / d2 [n]

这意味着我不必存储n-1值。

编辑2: strRes是指向之前生成的值的指针。像

这样的东西
typedef struct 
{
    double v1;
    double v2;
} strRes;

1 个答案:

答案 0 :(得分:2)

您可以使用以下代码。

typedef struct {
    double *val;
} strBuf;
strBuf Buf;

void meas1(strRes* res)
{
    Buf.val = malloc(2 * sizeof(double));
    Buf.val[0] = res->v1;
    Buf.val[1] = res->v2;
}

void meas2(strRes* res)
{
    Buf.val = malloc(1 * sizeof(double));
    Buf.val[0] = res->v1;
}

优点:在需要时动态分配内存。 没有不必要的记忆浪费。

缺点:速度,因为内存是在运行时分配的。