【问题标题】:In c language, Embedded Application, how to compare members from an Array of structure在c语言,嵌入式应用程序中,如何比较结构数组中的成员
【发布时间】:2017-06-09 06:18:03
【问题描述】:

我有一个内存芯片,它具有由嵌入式系统串行读取的数据。存储设备有 10 个位置,每个位置具有以下信息:customerID、NumOfParts、MFGName。 这是我为此编写的 C 代码版本。

在 C 文件“PartName.h”中

    //"PartName.h"
    #ifndef PartName_H
    #define PartName_H 

    typedef UINT8 MFGName_Struct_t [10];

    typedef struct
    {
        UINT8 customerID;
        UINT8 NumOfParts;
        MFGName_Struct_t MFGName;
    }IDENT_Struct_t;

    typedef struct MFG_Struct_t
    {
        UINT8 <some other variable>;        
        UINT8 <some other variable>;
        IDENT_Struct_t Ident1;
        IDENT_Struct_t Ident2;
        IDENT_Struct_t Ident3;
        IDENT_Struct_t Ident4;
        IDENT_Struct_t Ident5;
        IDENT_Struct_t Ident6;
        IDENT_Struct_t Ident7;
        IDENT_Struct_t Ident8;
        IDENT_Struct_t Ident9;
        IDENT_Struct_t Ident10; 
    } MFG_Struct_t;

    #endif

在 C 文件“HighNum.c”中

    //"HighNum.c"
    #include "PartName.h"
    static MFG_Struct_t  MFG; 
    UINT8 HighNum(void)
   {
     //UINT8 i;
       UINT8 highestNum = 0;
     //for (i = 0;(i < 10);i++) 

       if (MFG.Ident1.NumOfParts > MFG.Ident2.NumOfParts)
       {
           highestNum = MFG.Ident1.NumOfParts;
       }
       if (MFG.Ident2.NumOfParts > MFG.Ident3.NumOfParts)
       {
           highestNum = MFG.Ident2.NumOfParts;
       }
       if (MFG.Ident3.NumOfParts > MFG.Ident4.NumOfParts)
       {
           highestNum = MFG.Ident3.NumOfParts;
       }
       if (MFG.Ident4.NumOfParts > MFG.Ident5.NumOfParts)
       {
           highestNum = MFG.Ident4.NumOfParts;
       }
       <and so on>      
     return highestNum;
   }

如何在 C 语言中更有效地做到这一点?使用 for 语句或 While 语句?我考虑过连接数字部分并循环遍历变量...

【问题讨论】:

    标签: c for-loop struct while-loop compare


    【解决方案1】:

    如果您将结构修改为:

    #define IDENT_SIZE         10
    typedef struct MFG_Struct_t
    {
        UINT8 <some other variable>;        
        UINT8 <some other variable>;
        IDENT_Struct_t Ident[IDENT_SIZE];
    } MFG_Struct_t;
    

    那么你可以这样做:

    size_t i = 0;
    for (i = 0; i < IDENT_SIZE; i++) {
         if (MFG.Ident[i].NumOfParts > highestNum) {
               highestNum = MFG.Ident[i].NumOfParts;
         }
    }
    

    【讨论】:

    • size_t 是一种类型吗?我明白了……这个想法是让一个数组 os 成为您要比较的变量。出于某种原因,连接的想法在某种程度上不适用于问题类型。
    • size_t 是 C 标准类型。据我了解,您想要可变长度的数组吗?如果是这样,请改用dynamic memory allocation。如果您想要MFG 结构中Ident 字段的动态长度,我可以更新答案。
    • 如果你能在这个答案之外展示动态内存分配解决方案也是很好的。
    • 但是您在帖子中提到您的嵌入式系统中有 10 个固定位置,这意味着您可能不需要动态分配,这不是本主题的一部分
    【解决方案2】:

    希望下面的代码可以帮助到你:

    typedef struct MFG_Struct_t
    {
        UINT8 <some other variable>;        
        UINT8 <some other variable>;
        IDENT_Struct_t Idents[10];
    } MFG_Struct_t;
    
    typedef enum _Idents
    {
        Ident1 = 0,
        Ident2,
        Ident3,
        Ident4,
        Ident5,
        Ident6,
        Ident7,
        Ident8,
        Ident9,
        Ident10,
    } IdentType;
    
    
       if (MFG.Idents[Ident1].NumOfParts > MFG.Idents[Ident2].NumOfParts)
       {
           highestNum = MFG.Idents[Ident1].NumOfParts;
       }
    
    
    // or
    for (index = Ident1; index < Ident10; index ++)
    {
        if (MFG.Idents[index].NumOfParts > MFG.Idents[index +1].NumOfParts)
        {
            //......
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以重新定义结构以将 10 个“Ident”值放入一个数组中,然后使用 for 循环来测试您的值:

      typedef struct MFG_Struct_t
      {
          UINT8 <some other variable>;        
          UINT8 <some other variable>;
          IDENT_Struct_t Ident[10];
      } MFG_Struct_t;
          :
          :
      UINT8 HighNum(void) {
          UINT8 i, highestNum = 0;
      
          for (i = 0; i < 9; i++) {
              if (MFG.Ident[i].NumOfParts > MFG.Ident[i+1].NumOfParts) {
                  highestNum = MFG.Ident[i].NumOfParts;
              }
          }
          return highestNum;
      }
      

      或者,更好的是……将 HighNum 函数更改为更高效,如下:

      UINT8 HighNum(void) {
          UINT8 i, highestNum = MFG.Ident[0].NumOfParts;
      
          for (i = 1; i < 10; i++) {
              if (MFG.Ident[i].NumOfParts > highestNum) {
                  highestNum = MFG.Ident[i].NumOfParts;
              }
          }
          return highestNum;
      }
      

      【讨论】:

      • 我喜欢高效的部分,这就是这里的意图。
      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 2021-04-13
      • 2021-11-26
      • 2010-12-25
      • 2019-11-20
      • 2018-02-21
      • 2012-09-21
      • 2014-04-11
      相关资源
      最近更新 更多