函数参数作为C

时间:2017-11-17 09:08:42

标签: c pointers

在函数中我需要传入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
    }

}

1 个答案:

答案 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