C 指针而不是联合

C pointers instead of union

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

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

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 struct是一个可靠的方法,因为我在分配内存时不会出错。 不利的一面是在 State2 中不必要地使用内存。 另一个缺点是可能访问错误的变量。

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

编辑:

系统每 100 毫秒生成一次值。这些是在 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 是最快的日志)

第二种状态只计算两个double的比值: p = d1[n]/d2[n]

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

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

typedef struct 
{
    double v1;
    double v2;
} strRes;

您可以使用下面的代码。

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

优点:根据需要动态分配内存。 没有不必要的内存浪费。

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