将结构中的所有变量设置为零/一

Posted

技术标签:

【中文标题】将结构中的所有变量设置为零/一【英文标题】: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 【参考方案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,但两者都可以。

以上是关于将结构中的所有变量设置为零/一的主要内容,如果未能解决你的问题,请参考以下文章

局部变量设置为零? (目标-C)

满足语句时将变量设置为零的问题

将插入符号位置设置为零在 chrome 中的 contenteditable 元素的节点内

欺骗C编译器将整个结构分配为零,没有for循环[重复]

如何通过cuda中的索引将数组元素设置为零?

Swift 中的“清零”敏感字符串数据