首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将联合作为参数传递给函数

如何将联合作为参数传递给函数
EN

Stack Overflow用户
提问于 2011-04-18 21:33:13
回答 5查看 19K关注 0票数 8

此代码用于DAC芯片的驱动程序。

我下面有一个表示24位寄存器的位字段。因此,我需要做的是填充位域,并通过SPI将其写出到芯片。

代码语言:javascript
复制
    typedef struct {
        uint8_t rdwr_u8:       1;
        uint8_t not_used_u8:   3;
        uint8_t address_u8:    4;
        uint8_t reserved_u8:   8;
        uint8_t data_u8:       8;
        uint8_t padding_u8:    8;
    } GAIN_REG_st;

在我的初始化函数中,我创建了一个联合,如下所示。

代码语言:javascript
复制
    union{
        GAIN_REG_st GAIN_st;
        uint32_t G_32;
    } G_u;

现在,我需要将一个GAIN_REG_st位字段传递给一个函数,该函数将填充它。

一旦它被填充,我就可以将该位字段赋值给一个32位整数,并将该整数传递给一个低级函数以覆盖SPI。

当函数位于联合中时,如何将位字段GAIN_REG_st传递给该函数?(你能展示一个函数原型和调用吗)?

函数如何访问位域的成员?(它会像G_u.GAIN_st.rdwr_u8 = 1一样吗?)

EN

回答 5

Stack Overflow用户

发布于 2011-04-18 21:38:28

代码语言:javascript
复制
union G_u
  the_union;

the_union.GAIN_st.address_u8 = 0x4;

function_call( &the_union );

void function_call( union G_u *the_union )
{
    uint8
        address;

    address = the_union->GAIN_st.address_u8;

    return;
}

你是说这个吗?这是一个联盟,为什么要传递一个内部成员呢?这不会有任何不同。它们都从相同的内存偏移量开始。

票数 7
EN

Stack Overflow用户

发布于 2011-04-19 03:49:54

标题是关于通过工会,但问题是关于通过结构。您可以这样做,您只需相应地声明函数参数,并传递成员或整个联合。

所有当前的答案都演示了通过引用传递,但没有必要这样做,你可以通过复制传递,这对于最终为32位值的结构或联合不会更昂贵,并在被调用的函数中保存一个取消引用,因此可能更有效;

代码语言:javascript
复制
void fn( union G_u arg );

int main()
{
    union G_u param;
    ...
    fn( param );
}

或者传递结构:

代码语言:javascript
复制
void fn( GAIN_REG_st arg );

int main()
{
    GAIN_REG_st param;
    ...
    fn( param );
}

请注意,您可以使用以下结构来定义联合:

代码语言:javascript
复制
typedef union 
{
    GAIN_REG_st GAIN_st;
    uint32_t    G_32;
} G_u ;

那么第一个例子将是简单的;

代码语言:javascript
复制
void fn( G_u arg );

int main()
{
    G_u param;
    ...
    fn( param );
}

几乎可以肯定的是,传递结构或联合在开销上没有区别。这只是一个选择在哪里公开内部表示的知识的问题。

票数 6
EN

Stack Overflow用户

发布于 2011-04-18 21:37:17

原型:

代码语言:javascript
复制
int populateGainRegSt(GAIN_REG_st *st);

该函数可以使用->运算符访问结构字段:

代码语言:javascript
复制
st->data_u8 = 1;

用法:

代码语言:javascript
复制
G_u g;
...
populateGainRegSt( &(g.GAIN_st));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5703671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档