优化这段代码 if( DBData[i] >= RT1064KZZ_GL1_ALM && DBData[i] <= RT1064KZZ_KZHL && DBData[i] != RT1064KZZ_MODE && DBData[i] != RT1064KZZ_UAB_CH && DBData[i] != RT1064KZZ_UBC_CH && DBData[i] != RT1064KZZ_FBS && DBData[i] != RT1064KZZ_FBS_MODE) { LCD_DisString((i%9)+1, 20, (char *)gcszOnOff[(int)get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])]); if (not == 2) { if(draw == (i+1)) { LCD_DisString_Not((i%9)+1, 20, (char *)gcszOnOff[(int)get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])]); } } } else if(DBData[i] == RT1064KZZ_MODE) { LCD_DisString((i%9)+1, 20, (char *)ModeName[(int)get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])]); if (not == 2) { if(draw == (i+1)) { LCD_DisString_Not((i%9)+1, 20, (char *)ModeName[(int)get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])]); } } } else if (DBData[i] == RT1064KZZ_FBS || DBData[i] == RT1064KZZ_FBS_MODE ) { if (DBData[i] == RT1064KZZ_FBS) { LCD_DisString((i%9)+1, 20, (char *)FBS_NAME[(int)get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])]); if (not == 2) { if(draw == (i+1)) { LCD_DisString_Not((i%9)+1, 20, (char *)FBS_NAME[(int)get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])]); } } } else if(DBData[i] == RT1064KZZ_FBS_MODE ) { LCD_DisString((i%9)+1, 20, (char *)FBS_MODE_NAME[(int)get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])]); if (not == 2) { if(draw == (i+1)) { LCD_DisString_Not((i%9)+1, 20, (char *)FBS_MODE_NAME[(int)get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])]); } } } } else if(DBData[i] == RT1064KZZ_UAB_CH || DBData[i] == RT1064KZZ_UBC_CH || DBData[i] == RT1064_DZ_CHZCS) { sprintf(szVal, "%0.f" , get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])); LCD_DisString((i%9)+1, 19 , szVal); if(DBData[i] == RT1064_DZ_CHZCS) LCD_DisString((i%9)+1, 24, (char *)"次"); if (not == 2) { if(draw == (i+1)) { len = LCD_BitNot(UNIT_PROTECT,UNIT_GAP_RT1064,gapid,DBData[i],i,bit); } } }
时间: 2024-02-03 14:11:38 浏览: 73
可以考虑将重复的代码抽象成一个函数,然后在需要的地方调用该函数。具体来说,可以把以下部分抽象成一个函数:
```
LCD_DisString((i%9)+1, 20, (char *)gcszOnOff[(int)get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])]);
if (not == 2) {
if(draw == (i+1)) {
LCD_DisString_Not((i%9)+1, 20, (char *)gcszOnOff[(int)get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])]);
}
}
```
然后可以把其他类似的代码也进行抽象。这样可以大大简化代码,增强可读性。
相关问题
帮我优化这段代码 val = get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i]); if( DBData[i] >= RT1064KZZ_GL1_ALM && DBData[i] <= RT1064KZZ_KZHL && DBData[i] != RT1064KZZ_MODE && DBData[i] != RT1064KZZ_UAB_CH && DBData[i] != RT1064KZZ_UBC_CH && DBData[i] != RT1064KZZ_FBS && DBData[i] != RT1064KZZ_FBS_MODE) { displayString(isDraw,gcszOnOff[(int)val],(i%LISTOFFSET)+1,20); } else if(DBData[i] == RT1064KZZ_MODE) { displayString(isDraw,ModeName[(int)val],(i%LISTOFFSET)+1,20); } else if (DBData[i] == RT1064KZZ_FBS || DBData[i] == RT1064KZZ_FBS_MODE ) { displayString(isDraw,(DBData[i] == RT1064KZZ_FBS ?FBS_NAME[(int)val] :FBS_MODE_NAME[(int)val]),(i%LISTOFFSET)+1,20); } else if(DBData[i] == RT1064KZZ_UAB_CH || DBData[i] == RT1064KZZ_UBC_CH || DBData[i] == RT1064_DZ_CHZCS) { sprintf(szVal, "%0.f" , val); LCD_DisString((i%LISTOFFSET)+1, 19 , szVal); if(DBData[i] == RT1064_DZ_CHZCS) LCD_DisString((i%LISTOFFSET)+1, 24, (char *)"次"); if (isDraw == 1) len = LCD_BitNot(UNIT_PROTECT,UNIT_GAP_RT1064,gapid,DBData[i],i,bit); } else { sprintf(szVal, "%0.3f" , get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])); LCD_DisString((i%LISTOFFSET)+1, 19, szVal); if (DBData[i] >= RT1064_YS_GL1 && DBData[i] <= RT1064_YS_FBS_JY) LCD_DisString((i%9)+1, 25, (char *)"S"); else if ((DBData[i] >= RT1064_DZ_GL1 && DBData[i] <= RT1064_DZ_I02) || ((DBData[i] >= RT1064_DZ_PHASE_I && DBData[i] <= RT1064_DZ_I0DLT) && DBData[i] != RT1064_DZ_YL_HAR && DBData[i] != RT1064_DZ_LMJ) || DBData[i] == RT1064_DZ_SD || DBData[i] == RT1064_DZ_I0HJS || DBData[i] == RT1064_DZ_FC_CHZ || (DBData[i] >= RT1064_DZ_I03 && DBData[i] <= RT1064_DZ_FBS_I0)|| DBData[i] == RT1064_DZ_FBS_OL) { LCD_DisString((i%LISTOFFSET)+1, 25, (char *)"A"); } else if (DBData[i] == RT1064_DZ_LMJ || DBData[i] == RT1064_DZ_JC || DBData[i] == RT1064_DZ_GYJC) { LCD_DisString((i%LISTOFFSET)+1, 25, (char *)"°"); } else if (DBData[i] == RT1064_DZ_YL_HAR) LCD_DisString((i%LISTOFFSET)+1, 25, (char *)"%"); else if (DBData[i] == RT1064_DZ_IDS ||DBData[i] == RT1064_DZ_OPENCS || (DBData[i] >= RT1064_DZ_I03 && DBData[i] <= RT1064_DZ_FBS_I0)) { LCD_DisString((i%LISTOFFSET)+1, 24, (char *)"次"); } else if (DBData[i] == RT1064_DZ_DP || DBData[i] == RT1064_DZ_GP) { LCD_DisString((i%LISTOFFSET)+1, 25, (char *)"HZ"); } else LCD_DisString((i%LISTOFFSET)+1, 25, (char *)"V"); if (isDraw == 1)len = LCD_BitNot(UNIT_PROTECT,UNIT_GAP_RT1064,gapid,DBData[i],i,bit); }
首先,可以看到在代码中有很多重复的部分,比如调用`get_ActionDZInfo_val`函数、调用`sprintf`函数、调用`LCD_DisString`函数等。我们可以将这些重复的部分抽象成一个函数,减少代码的冗余。
其次,可以将一些常量和字符串存储到数组中,这样可以减少代码中的硬编码,提高可读性和可维护性。
最后,可以使用条件语句合并一些相似的逻辑,减少代码重复。
以下是重构后的代码:
```
const char* UNIT_NAME[] = {"V", "A", "S", "°", "%", "次", "HZ"};
const char* FBS_NAME[] = {"常开", "常闭"};
const char* FBS_MODE_NAME[] = {"标准", "反向"};
const char* ModeName[] = {"单相", "三相"};
void displayData(int isDraw, float val, int data, int i, int gapid, int bit) {
char szVal[16];
int x = (i % LISTOFFSET) + 1;
if (data >= RT1064KZZ_GL1_ALM && data <= RT1064KZZ_KZHL && data != RT1064KZZ_MODE && data != RT1064KZZ_UAB_CH && data != RT1064KZZ_UBC_CH && data != RT1064KZZ_FBS && data != RT1064KZZ_FBS_MODE) {
displayString(isDraw, UNIT_NAME[(int)val], x, 20);
} else if (data == RT1064KZZ_MODE) {
displayString(isDraw, ModeName[(int)val], x, 20);
} else if (data == RT1064KZZ_FBS || data == RT1064KZZ_FBS_MODE) {
displayString(isDraw, (data == RT1064KZZ_FBS ? FBS_NAME[(int)val] : FBS_MODE_NAME[(int)val]), x, 20);
} else if (data == RT1064KZZ_UAB_CH || data == RT1064KZZ_UBC_CH || data == RT1064_DZ_CHZCS) {
sprintf(szVal, "%0.f", val);
LCD_DisString(x, 19, szVal);
if (data == RT1064_DZ_CHZCS) {
LCD_DisString(x, 24, "次");
}
if (isDraw == 1) {
len = LCD_BitNot(UNIT_PROTECT, UNIT_GAP_RT1064, gapid, data, i, bit);
}
} else {
sprintf(szVal, "%0.3f", get_ActionDZInfo_val(UNIT_GAP_RT1064, gapid, data));
LCD_DisString(x, 19, szVal);
int index = -1;
if (data >= RT1064_YS_GL1 && data <= RT1064_YS_FBS_JY) {
index = 2;
} else if ((data >= RT1064_DZ_GL1 && data <= RT1064_DZ_I02) || ((data >= RT1064_DZ_PHASE_I && data <= RT1064_DZ_I0DLT) && data != RT1064_DZ_YL_HAR && data != RT1064_DZ_LMJ) || data == RT1064_DZ_SD || data == RT1064_DZ_I0HJS || data == RT1064_DZ_FC_CHZ || (data >= RT1064_DZ_I03 && data <= RT1064_DZ_FBS_I0) || data == RT1064_DZ_FBS_OL) {
index = 1;
} else if (data == RT1064_DZ_LMJ || data == RT1064_DZ_JC || data == RT1064_DZ_GYJC) {
index = 3;
} else if (data == RT1064_DZ_YL_HAR) {
index = 4;
} else if (data == RT1064_DZ_IDS || data == RT1064_DZ_OPENCS || (data >= RT1064_DZ_I03 && data <= RT1064_DZ_FBS_I0)) {
LCD_DisString(x, 24, "次");
} else if (data == RT1064_DZ_DP || data == RT1064_DZ_GP) {
index = 6;
}
if (index != -1) {
LCD_DisString(x, 25, UNIT_NAME[index]);
}
if (isDraw == 1) {
len = LCD_BitNot(UNIT_PROTECT, UNIT_GAP_RT1064, gapid, data, i, bit);
}
}
}
for (int i = 0; i < DBData.size(); i++) {
float val = get_ActionDZInfo_val(UNIT_GAP_RT1064, gapid, DBData[i]);
displayData(isDraw, val, DBData[i], i, gapid, bit);
}
```
优化这段代码 if( DBData[i] >= RT1064KZZ_GL1_ALM && DBData[i] <= RT1064KZZ_KZHL && DBData[i] != RT1064KZZ_MODE && DBData[i] != RT1064KZZ_UAB_CH && DBData[i] != RT1064KZZ_UBC_CH && DBData[i] != RT1064KZZ_FBS && DBData[i] != RT1064KZZ_FBS_MODE) { (isDraw ? LCD_DisString_Not((i%LISTOFFSET)+1, 20,(char *)gcszOnOff[(int)val]) : LCD_DisString((i%LISTOFFSET)+1, 20,(char *)gcszOnOff[(int)val]) ); } else if(DBData[i] == RT1064KZZ_MODE) { (isDraw ? LCD_DisString_Not((i%LISTOFFSET)+1, 20,(char *)ModeName[(int)val]) : LCD_DisString((i%LISTOFFSET)+1, 20,(char *)ModeName[(int)val]) ); } else if (DBData[i] == RT1064KZZ_FBS || DBData[i] == RT1064KZZ_FBS_MODE ) { (isDraw ? LCD_DisString_Not((i%LISTOFFSET)+1, 20,(char *)FBS_NAME[(int)val]) : LCD_DisString((i%LISTOFFSET)+1, 20,(char *)FBS_NAME[(int)val]) ); } else if(DBData[i] == RT1064KZZ_UAB_CH || DBData[i] == RT1064KZZ_UBC_CH || DBData[i] == RT1064_DZ_CHZCS) { sprintf(szVal, "%0.f" , val); LCD_DisString((i%LISTOFFSET)+1, 19 , szVal); if(DBData[i] == RT1064_DZ_CHZCS) LCD_DisString((i%LISTOFFSET)+1, 24, (char *)"次"); if (isDraw == 1) len = LCD_BitNot(UNIT_PROTECT,UNIT_GAP_RT1064,gapid,DBData[i],i,bit); } else { sprintf(szVal, "%0.3f" , get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i])); LCD_DisString((i%LISTOFFSET)+1, 19, szVal); if (DBData[i] >= RT1064_YS_GL1 && DBData[i] <= RT1064_YS_FBS_JY) LCD_DisString((i%9)+1, 25, (char *)"S"); else if ((DBData[i] >= RT1064_DZ_GL1 && DBData[i] <= RT1064_DZ_I02) || ((DBData[i] >= RT1064_DZ_PHASE_I && DBData[i] <= RT1064_DZ_I0DLT) && DBData[i] != RT1064_DZ_YL_HAR && DBData[i] != RT1064_DZ_LMJ) || DBData[i] == RT1064_DZ_SD || DBData[i] == RT1064_DZ_I0HJS || DBData[i] == RT1064_DZ_FC_CHZ || (DBData[i] >= RT1064_DZ_I03 && DBData[i] <= RT1064_DZ_FBS_I0)|| DBData[i] == RT1064_DZ_FBS_OL) { LCD_DisString((i%LISTOFFSET)+1, 25, (char *)"A"); } else if (DBData[i] == RT1064_DZ_LMJ || DBData[i] == RT1064_DZ_JC || DBData[i] == RT1064_DZ_GYJC) { LCD_DisString((i%LISTOFFSET)+1, 25, (char *)"°"); } else if (DBData[i] == RT1064_DZ_YL_HAR) LCD_DisString((i%LISTOFFSET)+1, 25, (char *)"%"); else if (DBData[i] == RT1064_DZ_IDS ||DBData[i] == RT1064_DZ_OPENCS || (DBData[i] >= RT1064_DZ_I03 && DBData[i] <= RT1064_DZ_FBS_I0)) { LCD_DisString((i%LISTOFFSET)+1, 24, (char *)"次"); } else if (DBData[i] == RT1064_DZ_DP || DBData[i] == RT1064_DZ_GP) { LCD_DisString((i%LISTOFFSET)+1, 25, (char *)"HZ"); } else LCD_DisString((i%LISTOFFSET)+1, 25, (char *)"V"); if (isDraw == 1)len = LCD_BitNot(UNIT_PROTECT,UNIT_GAP_RT1064,gapid,DBData[i],i,bit); }
这段代码可以优化的地方有:
1. 将重复的代码提取出来,避免重复书写。例如,多次调用 `LCD_DisString` 可以提取出来作为一个函数,减少代码重复。
2. 将一些条件语句的判断条件提取出来,避免重复书写。例如,多次使用 `DBData[i]` 的值进行判断,可以将它提取出来,避免重复书写。
3. 使用 switch 语句来替换多个 if-else 语句,使代码更加清晰。
4. 对于 `sprintf(szVal, "%0.3f" , get_ActionDZInfo_val(UNIT_GAP_RT1064,gapid,DBData[i]))` 这一行代码,可以考虑使用 snprintf 函数来避免缓冲区溢出。
下面是一个优化后的代码示例:
```
void displayData(int i, int isDraw, float val, char* szVal, int len) {
if (DBData[i] >= RT1064KZZ_GL1_ALM && DBData[i] <= RT1064KZZ_KZHL && DBData[i] != RT1064KZZ_MODE && DBData[i] != RT1064KZZ_UAB_CH && DBData[i] != RT1064KZZ_UBC_CH && DBData[i] != RT1064KZZ_FBS && DBData[i] != RT1064KZZ_FBS_MODE) {
displayString(i, isDraw, val, gcszOnOff, (i % LISTOFFSET) + 1, 20);
} else if (DBData[i] == RT1064KZZ_MODE) {
displayString(i, isDraw, val, ModeName, (i % LISTOFFSET) + 1, 20);
} else if (DBData[i] == RT1064KZZ_FBS || DBData[i] == RT1064KZZ_FBS_MODE) {
displayString(i, isDraw, val, FBS_NAME, (i % LISTOFFSET) + 1, 20);
} else if (DBData[i] == RT1064KZZ_UAB_CH || DBData[i] == RT1064KZZ_UBC_CH || DBData[i] == RT1064_DZ_CHZCS) {
snprintf(szVal, sizeof(szVal), "%0.f", val);
LCD_DisString((i % LISTOFFSET) + 1, 19, szVal);
if (DBData[i] == RT1064_DZ_CHZCS) {
LCD_DisString((i % LISTOFFSET) + 1, 24, (char *)"次");
}
if (isDraw == 1) {
len = LCD_BitNot(UNIT_PROTECT, UNIT_GAP_RT1064, gapid, DBData[i], i, bit);
}
} else {
snprintf(szVal, sizeof(szVal), "%0.3f", get_ActionDZInfo_val(UNIT_GAP_RT1064, gapid, DBData[i]));
LCD_DisString((i % LISTOFFSET) + 1, 19, szVal);
if (DBData[i] >= RT1064_YS_GL1 && DBData[i] <= RT1064_YS_FBS_JY) {
LCD_DisString((i % 9) + 1, 25, (char *)"S");
} else if ((DBData[i] >= RT1064_DZ_GL1 && DBData[i] <= RT1064_DZ_I02) || ((DBData[i] >= RT1064_DZ_PHASE_I && DBData[i] <= RT1064_DZ_I0DLT) && DBData[i] != RT1064_DZ_YL_HAR && DBData[i] != RT1064_DZ_LMJ) || DBData[i] == RT1064_DZ_SD || DBData[i] == RT1064_DZ_I0HJS || DBData[i] == RT1064_DZ_FC_CHZ || (DBData[i] >= RT1064_DZ_I03 && DBData[i] <= RT1064_DZ_FBS_I0)|| DBData[i] == RT1064_DZ_FBS_OL) {
LCD_DisString((i % LISTOFFSET) + 1, 25, (char *)"A");
} else if (DBData[i] == RT1064_DZ_LMJ || DBData[i] == RT1064_DZ_JC || DBData[i] == RT1064_DZ_GYJC) {
LCD_DisString((i % LISTOFFSET) + 1, 25, (char *)"°");
} else if (DBData[i] == RT1064_DZ_YL_HAR) {
LCD_DisString((i % LISTOFFSET) + 1, 25, (char *)"%");
} else if (DBData[i] == RT1064_DZ_IDS || DBData[i] == RT1064_DZ_OPENCS || (DBData[i] >= RT1064_DZ_I03 && DBData[i] <= RT1064_DZ_FBS_I0)) {
LCD_DisString((i % LISTOFFSET) + 1, 24, (char *)"次");
} else if (DBData[i] == RT1064_DZ_DP || DBData[i] == RT1064_DZ_GP) {
LCD_DisString((i % LISTOFFSET) + 1, 25, (char *)"HZ");
} else {
LCD_DisString((i % LISTOFFSET) + 1, 25, (char *)"V");
}
if (isDraw == 1) {
len = LCD_BitNot(UNIT_PROTECT, UNIT_GAP_RT1064, gapid, DBData[i], i, bit);
}
}
}
void displayString(int i, int isDraw, float val, char** stringArray, int x, int y) {
(isDraw ? LCD_DisString_Not(x, y, (char *)stringArray[(int)val]) : LCD_DisString(x, y, (char *)stringArray[(int)val]));
}
```
阅读全文