我有一个内存芯片,它有嵌入式系统串行读取的数据。内存设备有 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;
}