【发布时间】:2016-03-02 18:00:10
【问题描述】:
我主要使用 National Instruments 的 Labwindows CVI 作为编译器。
我必须为设备创建一个接口,然后开始为所有不同的寄存器寻找结构。
// Interface.h
typedef enum Color{
White,
Black,
Blue
};
typedef struct Register1{
int Bit1:1;
int Bit2:2;
Color col;
} Register1;
// Interface.c
BuildSendMessage(Register1 temp)
{
unsigned int iTemp;
iTemp = temp.Bit1 << 7 + temp.Bit2 << 5 + temp.col;
}
// sample.c
Register1 reg1;
reg1.Bit1 = 0;
reg1.Bit2 = 1;
reg1.col = White;
// Pass to function where message is built up
BuildSendMessage(reg1);
然后我在调用函数中填充结构,然后将结构传递给一个函数,在该函数中我执行所有位移、附加地址等到消息并通过通信接口发送出去。
这可以改进吗?我应该隐藏更多信息并让函数填充结构吗?我一直在做很多阅读,这肯定可以使用一些改进。
【问题讨论】:
-
您的信息太有限,无法给出好的答案。现在,我建议您继续前进,做您认为最好的事情。然后,如果可行,就去“重构”代码(即学习并构建一个新版本)。
-
请注意,位域结构的布局在 C 中定义得非常糟糕。对于硬件寄存器,请使用
stdint.h无符号 固定宽度类型、掩码和位运算符.小心整数促销。 -
我想要做的是我有一个我通过 tcp 与之交谈的设备,它有一个文档解释每个寄存器的作用。我有一些代码,我将在其中设置仪器、写入此设备、绘制数据等。其他人以后可能会使用此代码。我的计划是填写结构的字段,因为我需要设置设备,然后将其传递给构建完整消息的函数。看起来这个结构应该对最终用户隐藏,并且应该公开具有通用字段的函数。
-
iTemp = temp.Bit1 << 7 + temp.Bit2 << 5 + temp.col;-->>iTemp = (temp.Bit1 << 7) + (temp.Bit2 << 5) + (temp.col & 0x0f);你的编译器应该警告你
标签: c struct information-hiding