qq_43391736 2022-12-05 15:28 采纳率: 40%
浏览 27
已结题

结构体数据存入数组,以及方法的简单调用

在使用c语音编写时候出现两个问题
          1.将结构体中的数据存入数组中的动作,非常繁琐,有没有简便方法
          2.根据ID调用多个方法的动作也非常繁琐,有没有可以简化的功能
    ubyte a[26][8]={
                           {Ad0Demo_stAd_numAnPinCh1Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh1Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh1Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh1Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh1Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh2Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh2Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh2Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh2Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh2Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh3Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh3Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh3Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh3Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh3Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh4Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh4Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh4Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh4Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh4Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh5Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh5Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh5Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh5Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh5Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh6Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh6Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh6Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh6Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh6Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh7Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh7Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh7Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh7Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh7Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh8Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh8Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh8Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh8Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh8Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh11Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh11Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh11Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh11Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh11Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh13Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh13Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh13Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh13Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh13Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh14Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh14Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh14Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh14Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh14Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh15Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh15Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh15Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh15Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh15Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numChrMicAnPinCh18Result.Ad_numAdErr,Ad0Demo_stAd_numChrMicAnPinCh18Result.Ad_numAdPause,Ad0Demo_stAd_numChrMicAnPinCh18Result.Ad_numAdRecovery,Ad0Demo_stAd_numChrMicAnPinCh18Result.Ad_stAdStatus,Ad0Demo_stAd_numChrMicAnPinCh18Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numAnPinCh19Result.Ad_numAdErr,Ad0Demo_stAd_numAnPinCh19Result.Ad_numAdPause,Ad0Demo_stAd_numAnPinCh19Result.Ad_numAdRecovery,Ad0Demo_stAd_numAnPinCh19Result.Ad_stAdStatus,Ad0Demo_stAd_numAnPinCh19Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numT5v2AnPinCh21Result.Ad_numAdErr,Ad0Demo_stAd_numT5v2AnPinCh21Result.Ad_numAdPause,Ad0Demo_stAd_numT5v2AnPinCh21Result.Ad_numAdRecovery,Ad0Demo_stAd_numT5v2AnPinCh21Result.Ad_stAdStatus,Ad0Demo_stAd_numT5v2AnPinCh21Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numT5v1AnPinCh22Result.Ad_numAdErr,Ad0Demo_stAd_numT5v1AnPinCh22Result.Ad_numAdPause,Ad0Demo_stAd_numT5v1AnPinCh22Result.Ad_numAdRecovery,Ad0Demo_stAd_numT5v1AnPinCh22Result.Ad_stAdStatus,Ad0Demo_stAd_numT5v1AnPinCh22Result.Ad_valAd/1000,0,0,0},
                           {Ad0Demo_stAd_numBatAnPinCh23Result.Ad_numAdErr,Ad0Demo_stAd_numBatAnPinCh23Result.Ad_numAdPause,Ad0Demo_stAd_numBatAnPinCh23Result.Ad_numAdRecovery,Ad0Demo_stAd_numBatAnPinCh23Result.Ad_stAdStatus,Ad0Demo_stAd_numBatAnPinCh23Result.Ad_valAd/1000,0,0,0},
                           {Dio_valIo_stHiPwrAnPinCh20Result_LO.Dio_stErrIn,Dio_valIo_stHiPwrAnPinCh20Result_LO.Dio_valIn/1000,0,0,0},
                           {Dio_valIo_stInPinCh0Result_LO.Dio_stErrIn,Dio_valIo_stInPinCh0Result_LO.Dio_valIn/1000,0,0,0,0,0,0},
                           {Dio_valIo_stInPinCh1Result_LO.Dio_stErrIn,Dio_valIo_stInPinCh1Result_LO.Dio_valIn/1000,0,0,0,0,0,0},
                           {Dio_valIo_stInPinCh2Result_LO.Dio_stErrIn,Dio_valIo_stInPinCh2Result_LO.Dio_valIn/1000,0,0,0,0,0,0},
                           {Dio_valIo_stInPinCh4Result_LO.Dio_stErrIn,Dio_valIo_stInPinCh4Result_LO.Dio_valIn/1000,0,0,0,0,0,0},
                           {Dio_valIo_stInPinCh5Result_LO.Dio_stErrIn,Dio_valIo_stInPinCh5Result_LO.Dio_valIn/1000,0,0,0,0,0,0},
                           {Dio_valIo_stInPinCh7Result_LO.Dio_stErrIn,Dio_valIo_stInPinCh7Result_LO.Dio_valIn/1000,0,0,0,0,0,0},
                           {Dio_valIo_stInPinCh8Result_LO.Dio_stErrIn,Dio_valIo_stInPinCh8Result_LO.Dio_valIn/1000,0,0,0,0,0,0},
                           {Dio_valIo_stInPinCh10Result_LO.Dio_stErrIn,Dio_valIo_stInPinCh10Result_LO.Dio_valIn/1000,0,0,0,0,0,0}
                         };

                switch(Can_stSndMsg.Msg_Id)
                {
                case 1:Send_CANdata_NodeB_Chann1(&Can_stSndMsg);break;
                case 2:Send_CANdata_NodeB_Chann2(&Can_stSndMsg);break;
                case 3:Send_CANdata_NodeB_Chann3(&Can_stSndMsg);break;
                case 4:Send_CANdata_NodeB_Chann4(&Can_stSndMsg);break;
                case 5:Send_CANdata_NodeB_Chann5(&Can_stSndMsg);break;
                case 6:Send_CANdata_NodeB_Chann6(&Can_stSndMsg);break;
                case 7:Send_CANdata_NodeB_Chann7(&Can_stSndMsg);break;
                case 8:Send_CANdata_NodeB_Chann8(&Can_stSndMsg);break;
                case 9:Send_CANdata_NodeB_Chann9(&Can_stSndMsg);break;
                case 10:Send_CANdata_NodeB_Chann10(&Can_stSndMsg);break;
                case 11:Send_CANdata_NodeB_Chann11(&Can_stSndMsg);break;
                case 12:Send_CANdata_NodeB_Chann12(&Can_stSndMsg);break;
                case 13:Send_CANdata_NodeB_Chann13(&Can_stSndMsg);break;
                case 14:Send_CANdata_NodeB_Chann14(&Can_stSndMsg);break;
                case 15:Send_CANdata_NodeB_Chann15(&Can_stSndMsg);break;
                case 16:Send_CANdata_NodeB_Chann16(&Can_stSndMsg);break;
                case 17:Send_CANdata_NodeB_Chann17(&Can_stSndMsg);break;
                case 18:Send_CANdata_NodeB_Chann18(&Can_stSndMsg);break;
                case 19:Send_CANdata_NodeB_Chann19(&Can_stSndMsg);break;
                case 20:Send_CANdata_NodeB_Chann20(&Can_stSndMsg);break;
                case 21:Send_CANdata_NodeB_Chann21(&Can_stSndMsg);break;
                case 22:Send_CANdata_NodeB_Chann22(&Can_stSndMsg);break;
                case 23:Send_CANdata_NodeB_Chann23(&Can_stSndMsg);break;
                case 24:Send_CANdata_NodeB_Chann24(&Can_stSndMsg);break;
                case 25:Send_CANdata_NodeB_Chann25(&Can_stSndMsg);break;
                case 26:Send_CANdata_NodeB_Chann26(&Can_stSndMsg);break;
                }
extern void Send_CANdata_NodeB_Chann0(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann1(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann2(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann3(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann4(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann5(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann6(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann7(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann8(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann9(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann10(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann11(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann12(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann13(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann14(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann15(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann16(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann17(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann18(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann19(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann20(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann21(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann22(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann23(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann24(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann25(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann26(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann27(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann28(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann29(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann30(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann31(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann32(Can_sendObjNew *Can_valSendObjNew);
extern void Send_CANdata_NodeB_Chann33(Can_sendObjNew *Can_valSendObjNew);

第一个问题,我曾想到用工厂方法解决,并在尝试中
第二个问题,由于id和channel方法无任何关联,所以我暂时还没有想法
  • 写回答

1条回答 默认 最新

  • 伍六七0804 2022-12-05 16:39
    关注
    可以采用数组函数的形式 ,用for循环去找ID对应的处理函数  这种方法在linux内核中会经常用到
    首先建立一个结构体如下
    
    typedef struct
    {
        uint8_t cmd;
        uint8_t (*do_cmd)(uint16_t src, uint8_t *pBuf, uint8_t pLen);
    }_jni_cmd_process_t;
    
    其中的cmd是某个协议中的命令,之后代表处理不同的业务流程
    do_cmd是具体的处理函数
    
    
    主程序中定义一个数组
    const _jni_cmd_process_t _jni_cmd_list[MAX_JNI_CMD_COUNTS]=
    {
        {LWRF_LCL_JOIN_REPORT,_do_join_report_rsp},
            
    };
    
    这样只要找到LWRF_LCL_JOIN_REPORT就能找对应的处理函数_do_join_report_rsp
    
    
    应用方式
    其中MAX_JNI_CMD_COUNTS是数组的最大长度
    
        for(uint8_t index = 0; index < MAX_JNI_CMD_COUNTS; index++)
        {
            if(cmd == _jni_cmd_list[index].cmd)
            {
                _jni_cmd_list[index].do_cmd(&pBuf[LCL_HEADER_LEN], pLen - LCL_HEADER_LEN);
            }
        }
        
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 12月5日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表