gpt4 book ai didi

c - 如何将结构转换为 uint8_t(错误 : conversion to non-scalar type requested)

转载 作者:行者123 更新时间:2023-12-02 02:48:55 24 4
gpt4 key购买 nike

我需要将8个继电器的状态存储在EEPROM中。我不想为移位而烦恼,而且我喜欢使用位域。所以我想这样定义它们:

typedef struct{
uint8_t RELAY0_STATE:1;
uint8_t RELAY1_STATE:1;
uint8_t RELAY2_STATE:1;
uint8_t RELAY3_STATE:1;
uint8_t RELAY4_STATE:1;
uint8_t RELAY5_STATE:1;
uint8_t RELAY6_STATE:1;
uint8_t RELAY7_STATE:1;
}relay_nvm_t;

relay_nvm_t relay_nvm;

在我的主代码流程中,我使用 relay_nvm 变量设置每个继电器的状态。示例

...
if(something)
{
relay_nvm.RELAY0_STATE = 1;
relay_nvm.RELAY1_STATE = 0;
relay_nvm.RELAY2_STATE = 1;
relay_nvm.RELAY3_STATE = 0;
relay_nvm.RELAY4_STATE = 1;
relay_nvm.RELAY5_STATE = 1;
relay_nvm.RELAY6_STATE = 0;
relay_nvm.RELAY7_STATE = 1;
}

最后,当我需要读/写 EEPROM 时,我只需将 relay_nvm 转换为 uint8_t 即可将一个字节读/写到 EEPROM。但我收到错误:请求转换为非标量类型错误。以下是我的功能。

static void NVM_Relay_Read(void)
{
relay_nvm = (relay_nvm_t)NVM_ReadEepromByte(NVM_RELAY_INDEX);
}

static void NVM_Relay_Write(relay_nvm_t rs)
{
NVM_WriteEepromByte(NVM_RELAY_INDEX, (uint8_t)rs);
}

有什么办法可以克服这个错误吗?我以为我可以通过打字来做到这一点。位域的使用使我的工作变得非常简单,并且使代码易于理解。

我知道在这种情况下,由于填充,位域可能不安全,但我认为我可以使用 POP-PUSH 克服它(值得吗?)

最佳答案

我看到了更多处理这个问题的方法:

  1. 使用 union 。

  2. 使用指针类型转换:*((uint8_t*)&relay_nvm)

  3. 使用 uint8_t:

    uint8_t relay_nvm;
#define RELAY0_MASK 1
#define RELAY1_MASK 2
#define RELAY2_MASK 4
...
#define RELAY7_MASK 128

// set exact relays state:
relay_nvm = RELAY0_MASK | RELAY2_MASK | RELAY4_MASK | ... ;

// set single relay (others left unchanged):
relay_nvm |= RELAY2_MASK;

// clear single relay (others left unchanged):
relay_nvm &= ~RELAY2_MASK;

// check current state of a relay:
if (relay_nvm & RELAY2_MASK) { ... }

关于c - 如何将结构转换为 uint8_t(错误 : conversion to non-scalar type requested),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62383368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com