C语言-函数嵌入数组的用法

 例子

#include <stdio.h>
#include <string.h>
#include <stdint.h>
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
typedef union
{
    struct
    {
        u8 plcRegStackHb : 1;
        u8 plcRegFwDoorBool : 1;
        u8 plcRegRsvdBit1 : 1;
        u8 plcRegSlotStaBool : 1;
        u8 plcRegRsvdBit2 : 1;
        u8 plcRegRsvdBit3 : 1;
        u8 plcRegRsvdBit4 : 1;
        u8 plcRegRsvdBit5 : 1;
        u8 plcRegRsvdWord;
    } bStack;
    struct
    {
        u8 plcRegSenFwDoorSw : 1;
        u8 plcRegSenFirDoor : 1;
        u8 plcRegSenTrayTouch : 1;
        u8 plcRegSenTrayEnter : 1;
        u8 plcRegSenSmoke : 1;
        u8 plcRegSenSlotDoor : 1;
        u8 plcRegSenBackDoor : 1;
        u8 plcRegSenRsvdBit : 1;
        u8 plcRegMaskFireDoor : 1;
        u8 plcRegMaskTrayTouch : 1;
        u8 plcRegMaskTrayEnter : 1;
        u8 plcRegMaskSlotDoor : 1;
        u8 plcRegMaskRsvd1 : 1;
        u8 plcRegMaskRsvd2 : 1;
        u8 plcRegMaskRsvd3 : 1;
        u8 plcRegMaskRsvd4 : 1;
    } b;
    u16 SenSta;
} plcRegSenSta, *plcRegSenStaPtr;

/*所有串口设备共用消息头*/
typedef struct
{
    u8 devAddr;
    u8 funcCode; /*UartFuncCode*/
    u8 payload1[1];
    u8 pldLen; /*负载长度,不含消息头*/
    u8 flowSeq;
    u8 payload[0];
} UartMsgHead;

typedef void (*fun_type1)(plcRegSenSta a, plcRegSenSta b);
typedef void (*fun_type2)(plcRegSenSta *a, UartMsgHead *b);
typedef void (*fun_type3)(UartMsgHead a, UartMsgHead b);

typedef struct
{
    fun_type1 A;
    fun_type2 B;
    fun_type3 C;
    // int a;
} funname;

void fun1(plcRegSenSta num1, plcRegSenSta num2)
{
    printf("fun1:b类型       %u %u %u %u %u\r\n", num1.b.plcRegSenFwDoorSw, num1.b.plcRegSenFirDoor, num1.b.plcRegSenTrayTouch, num1.b.plcRegSenTrayEnter, num1.b.plcRegSenSmoke);
    printf("fun1:bStack类型  %u %u %u %u %u\r\n", num1.bStack.plcRegStackHb, num1.bStack.plcRegFwDoorBool, num1.bStack.plcRegRsvdBit1, num1.bStack.plcRegSlotStaBool, num1.bStack.plcRegRsvdBit2, num1.bStack.plcRegRsvdBit3);
}

void fun2(plcRegSenSta *num1, UartMsgHead *num2)
{
    printf("fun2:b类型  %u %u %u %u %u\r\n", num1->b.plcRegSenFwDoorSw, num1->b.plcRegSenFirDoor, num1->b.plcRegSenTrayTouch, num1->b.plcRegSenTrayEnter, num1->b.plcRegSenSmoke);
    printf("fun2: fun_Msg1->devAddr:%u  fun_Msg1->funcCode:%u\r\n", num2->devAddr, num2->funcCode);
}

void fun3(UartMsgHead num1, UartMsgHead num2)
{
    printf("fun3: fun_Msg1.devAddr:%u   fun_Msg2.funcCode:%u\r\n", num1.devAddr, num2.funcCode);
}

int main(void)
{
    u8 strnum[] = {'a', 'b', 'c', 'd', 'd', 'e', 'f', 'g', 'h', 'i'};
    u8 strnum1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
    funname str[] = {
        {fun1, fun2, fun3},
    };

    plcRegSenSta *fun_sta1 = (plcRegSenSta *)&strnum[0];
    plcRegSenSta *fun_sta2 = (plcRegSenSta *)&strnum[0];
    UartMsgHead *fun_Msg1 = (UartMsgHead *)&strnum1[1];
    UartMsgHead *fun_Msg2 = (UartMsgHead *)&strnum1[1];

    str[0].A(*fun_sta1, *fun_sta2);
    str[0].B(fun_sta1, fun_Msg1);
    str[0].C(*fun_Msg1, *fun_Msg2);

    printf("fun_type1类型字节大小:%d\r\n", sizeof(fun_type1));
    printf("funname类型字节大小:%d\r\n", sizeof(funname));
    printf("fun_sta1地址字节大小:%d\r\n", sizeof(fun_sta1));
    printf("*fun_sta1变量字节大小:%d\r\n", sizeof(*fun_sta1));
    printf("fun_Msg1变量字节大小:%d\r\n", sizeof(fun_Msg1));
    printf("*fun_Msg1变量字节大小:%d\r\n", sizeof(*fun_Msg1));
    return 0;
}

运行结果

分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值