将结构中的所有变量设置为零/一
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 (&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(&pins, 0, sizeof(pins));
将全部设置为 1:memset(&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 << 0 );
我得到0000 0001
这就是我需要的。
我需要全部设置为0000 0000
和0000 0001
。因为我用的是Bit-field,我只有on bit,所以这个BIT应该是0
和1
@JohnDoe :您还没有理解这个答案;通过将结构占用的所有 bytes 设置为全 1,单个位域将隐式变为 1
,因为它们被 打包 到那些 bytes。你可以试试看。请注意,我建议 ~0
而不是 -1
,但两者都可以。以上是关于将结构中的所有变量设置为零/一的主要内容,如果未能解决你的问题,请参考以下文章