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;
}
优点:根据需要动态分配内存。
没有不必要的内存浪费。
缺点:速度,因为内存是在 运行 时分配的。
我有一个嵌入式系统,它应该根据其状态存储不同的结果集。
一种可能的解决方案是使用联合:
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;
}
优点:根据需要动态分配内存。 没有不必要的内存浪费。
缺点:速度,因为内存是在 运行 时分配的。