在函数中我需要传入myFlg和somVar作为输入参数。使用该函数修改它们,然后返回newLevel。
我是否传递了myFlg和somVar的指针,我该怎么做。 flg和counter需要在函数内部更新,但它们不是全局变量。所以传入两个参数/指针并返回一个值,一个返回值和两个修改后的值/指针。
in flags.h
#define FlagReg1set_u 0b01000001
typedef union
{
struct
{
uint8_t Flg1 : 1;
uint8_t Flg2 : 1;
uint8_t Flg3 : 1;
uint8_t Flg4 : 1;
uint8_t Flg5 : 1;
uint8_t Flg6 : 1;
uint8_t my_Flg : 1;
uint8_t foo : 1;
} bits;
uint8_t byte;
} FlagReg1_t = FlagReg1set_u;
in level.c
uint16_t level(uint8_t Flag, uint8_t SomeVariable, uint8_t SomeCount)
{
static uint16_t newLevel = SomeVariable;
static uint8_t count = SomeCount;
static uint8_t somVar;
if (FlagReg1.bits.my_Flg == 1)
{
/* do something */
newLevel = 0xFFFF;
}
else
{
FlagReg1.bits.my_Flg = 0
}
if (somVar == SomeVariable)
{
count = 0;
}
else
{
count++;
}
return newLevel
}
in main .c
#include "flags.h"
main()
{
/* Variable Declaration */
uint16_t level(uint8_t Flag, uint8_t SomeVariable, uint8_t SomeCount);
uint8_t count = 0;
uint8_t ownlevel;
uint16_t newLevel;
level(FlagReg1_t my_Flg, ownlevel, count);
if (newLevel == 0)
{
//do something
}
else
{
//do something
}
}
答案 0 :(得分:0)
社区的借口我使用答案空间,这更多是评论,但我需要工具来解释。 所以,eumac,工会的通常目的是:
typedef union eumac_un_t
{
struct eumac_str
{
uint8_t flag_4;
uint8_t flag_3;
uint8_t flag_2;
uint8_t flag_1;
};
int the_flag;
}eumac_un;
这需要4个字节(一个存储区),存储可以各种方式检索的相同数据。 存储示例
eumac_un_t.eumac_str.flag_1 = 150 //(1001 0110)
eumac_un_t.eumac_str.flag_2 = 20 //(0001 0100)
你得到的是什么
eumac_un_t.the_flag == 5270 //its 0000 0000 - 0000 0000 - 0001 0100 - 1001 0110
这就是我们使用联盟的原因。所以在你的情况下你不会需要它。那就清楚了吗?
现在在你的情况下,通常你有一个数组时作为指针传递。如果标志只是一个整数,那么你可以简单地将它作为一个整数传递。
所以,是的,你提到的功能非常好
uint16_t level(FlagReg1_t *ptrToFlagReg1, uint8_t *SomeVariable, uint8_t *SomeCount)
{
ptrToFlagReg1->something = something;
ptrToFlagReg1->something_else = something_else;
return number_of_something;
}
如果没有必要,整数不一定要作为指针传递。
uint8_t SomeVariable, uint8_t SomeCount