【问题标题】:Ansi-C C99 Interface with structAnsi-C C99 接口与结构
【发布时间】: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 &lt;&lt; 7 + temp.Bit2 &lt;&lt; 5 + temp.col; -->> iTemp = (temp.Bit1 &lt;&lt; 7) + (temp.Bit2 &lt;&lt; 5) + (temp.col &amp; 0x0f); 你的编译器应该警告你

标签: c struct information-hiding


【解决方案1】:

我想要做的是我有一个我通过 tcp 与之交谈的设备 有一份文件解释了每个寄存器的作用。

…

然后我在调用函数中填充结构,然后传递 结构成一个我做所有位移的函数,附加 地址等信息并通过通讯发送出去 界面。

这可以改进吗?我是否应该隐藏更多信息并拥有 一个函数填充结构?

来自Wikipedia:

在计算机科学中,信息隐藏是 设计决策在计算机程序中的分离 最有可能发生变化,从而保护程序的其他部分免受 如果设计决策发生变化,则进行大量修改。这 保护包括提供一个稳定的接口,保护 程序的其余部分(详细信息是 最有可能改变)。

每个寄存器在设备中所做的事情不太可能改变,如果它最终应该改变,程序的其他部分可能无论如何都需要修改,所以“更多信息隐藏”没有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 2016-03-30
    • 1970-01-01
    • 2013-06-16
    • 2018-09-22
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多