【问题标题】:Set all variables in struct to zero / one将结构中的所有变量设置为零/一
【发布时间】:2019-01-24 09:38:20
【问题描述】:

我想知道是否可以将结构中存在的所有变量(在循环内)初始化为0 并返回到1

这是一个演示程序:

#include <stdio.h>

#define LEDS_LENGTH 7

void inititate_to_zero(void);
void inititate_to_one(void);

struct pins
{
    unsigned char state : 1;
    unsigned char LED0  : 1;
    unsigned char LED1  : 1;
    unsigned char LED2  : 1;
    unsigned char LED3  : 1;
    unsigned char LED4  : 1;
    unsigned char LED5  : 1;
}pins;

int main(void)
{
    inititate_to_zero( );
    inititate_to_one( );
}

void inititate_to_zero(void)
{
    for(unsigned char i = 0; i < LEDS_LENGTH; i++)
    {
        /// set all variable in struct pins to 0;
        pins.VARIABLE[SOME_HOW] ^= ( 1 << 0 );
    }
}

void inititate_to_one(void)
{
    for (unsigned char i = 0; i < LEDS_LENGTH; i++)
    {
        /// set all variable in struct pins to 1;
        pins.VARIABLE[SOME_HOW] ^= ( 1 << 0 );
    }
}

编辑:

如果可能,我需要替换函数 inititate_to_one() 以使用 LOOP:

#include <stdio.h>

#define LEDS_LENGTH 7

void inititate_to_one ( void );

struct pins
{
    volatile unsigned char state    : 1;
    unsigned char LED0              : 1;
    unsigned char LED1              : 1;
    unsigned char LED2              : 1;
    unsigned char LED3              : 1;
    unsigned char LED4              : 1;
    unsigned char LED5              : 1;
}pins{ 0 };


int main( void )
{
    inititate_to_one ( );
}

void inititate_to_one( void )
{
    state ^= ( 1 << 0 );
    LED0  ^= ( 1 << 0 );
    LED1  ^= ( 1 << 0 );
    LED2  ^= ( 1 << 0 );
    LED3  ^= ( 1 << 0 );
    LED4  ^= ( 1 << 0 );
    LED5  ^= ( 1 << 0 );
}

【问题讨论】:

  • 也许你真正想要的是一个数组?或者可能单个 unsigned char 用作位域?
  • C 结构的 初始化 为 0(或任何零值/空值)很简单。稍后设置为0或1,或者初始化为1,是不同的。所以这真的取决于你问什么问题准确地
  • 如何制作一个 LED[i] 阵列而不是 led0 led1...
  • 您有memset 可用吗? (例如memset (&amp;pins, 1, sizeof (struct pins));),只需使用0 将每个字节归零。
  • @DavidC.Rankin 这个 memset 不起作用。而不是 1 你需要 0xff

标签: c


【解决方案1】:

拥有

struct pins
{
    volatile unsigned char state    : 1;
    unsigned char LED0              : 1;
    unsigned char LED1              : 1;
    unsigned char LED2              : 1;
    unsigned char LED3              : 1;
    unsigned char LED4              : 1;
    unsigned char LED5              : 1;
}pins;

将所有设置为 0:memset(&amp;pins, 0, sizeof(pins));

将全部设置为 1:memset(&amp;pins, -1, sizeof(pins));

并且可能 memset 将被优化为仅设置一个字节


帮助 John Doe:

#include <stdio.h>
#include <string.h>

struct pins
{
    volatile unsigned char state    : 1;
    unsigned char LED0              : 1;
    unsigned char LED1              : 1;
    unsigned char LED2              : 1;
    unsigned char LED3              : 1;
    unsigned char LED4              : 1;
    unsigned char LED5              : 1;
} pins;

void pr()
{
  printf("%u %u %u %u %u %u %u\n",
     pins.state, pins.LED0, pins.LED1, pins.LED2, pins.LED3, pins.LED4, pins.LED5);
}

int main()
{
  /* pins is already to 0 because static */
  memset(&pins, -1, sizeof(pins));
  pr();
  memset(&pins, 0, sizeof(pins));
  pr();
  memset(&pins, -1, sizeof(pins));
  pr();

  return 0;
}

执行:

1 1 1 1 1 1 1
0 0 0 0 0 0 0
1 1 1 1 1 1 1

【讨论】:

  • 而那个值 255,它是从哪里来的?
  • @Dominique 255 的所有位为 1,十六进制为 0xff,二进制为 11111111
  • 并非所有位。如果一个字节有8 位:那么0 表示0000 0000,我需要的是0000 0001 用于所有变量。想一想:uint8_t led = 0: 这意味着0000 0000 然后如果我这样做led ^= ( 1 &lt;&lt; 0 ); 我得到0000 0001 这就是我需要的。
  • 我需要全部设置为0000 00000000 0001。因为我用的是Bit-field,我只有on bit,所以这个BIT应该是01
  • @JohnDoe :您还没有理解这个答案;通过将结构占用的所有 bytes 设置为全 1,单个位域将隐式变为 1,因为它们被 打包 到那些 bytes。你可以试试看。请注意,我建议 ~0 而不是 -1,但两者都可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多