在c语言中,嵌入式应用程序,如何比较结构数组中的成员



我有一个内存芯片,它有嵌入式系统串行读取的数据。内存设备有 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 语句更有效地完成此操作?我想过连接数字部分并在变量中循环......

如果您将结构修改为:

#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;
}
}

我希望以下代码可以帮助您:

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)
{
//......
}
}

您可以重新定义结构以将 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;
}

相关内容

  • 没有找到相关文章

最新更新