C语言中作为指针和返回值的函数参数

C语言中作为指针和返回值的函数参数,c,pointers,C,Pointers,在函数中,我需要传入myFlg和somVar作为输入参数。使用函数修改它们,然后返回newLevel 我是否传递myFlg和somVar的指针,以及如何传递。flg和计数器需要在函数内部更新,但它们不是全局的。因此,传入两个参数/指针并返回一个值、一个返回值和两个修改后的值/指针 in flags.h #define FlagReg1set_u 0b01000001 typedef union { struct { uint8_t Fl

在函数中,我需要传入myFlg和somVar作为输入参数。使用函数修改它们,然后返回newLevel

我是否传递myFlg和somVar的指针,以及如何传递。flg和计数器需要在函数内部更新,但它们不是全局的。因此,传入两个参数/指针并返回一个值、一个返回值和两个修改后的值/指针

     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
    }

}

好吧,对于社区来说,我使用答案空间,这更多的是一个评论,但我需要工具来解释。 因此,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

如果您选择了snake case脚本,我将不胜感激。出于各种原因,myFlg更适合作为my_标志。您也有各种错误。例如。typedef联合标志{bla}标志;你错过了类型。struct也是一样。你也不清楚联合是什么。这只是一个示例代码,不是真正的代码,我正在寻求帮助,了解如何做我需要的事情,即从函数返回值,更改函数中的变量和结构,这将使更改保持在函数之外。union的用途是能够将所有位设置为默认值,我省略了它。既然您标记了C,那么您最好使用C而不是“测试”代码。union已经在这个项目中使用,我需要修改它。您能否指导我/帮助我在这种情况下使用指针,传入一个标志、一个计数并返回一个值,同时修改标志和计数。函数应该是这样的,uint16_t level(FlagReg1_t*ptrToFlagReg1,uint8_t*SomeVariable,uint8_t*SomeCount),以及main()中对flg,count的声明是什么?为了澄清我已经更改了原始代码示例,这是需要的吗?