结构体数组

遍历结构体数组

通过结构体字段地址偏移量访问成员变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void rerangeenumberea6bit(const uint8 *config, 
uint8 entry_size_in_byte,
uint8 field_offset_in_byte,
uint8 config_count,
Wordoprerangegiveult *sort_result) {
uint8 seqlsti;
uint8 seqlstj;
uint8 rerangeedenumup = 0U;
uint8 cutinepos;
const uint8 *numbereptr = config + field_offset_in_byte;
uint16 number;
for(seqlsti = 0u; seqlsti < config_count; seqlsti++) {
number = *((const uint16*)numbereptr);
cutinepos = rerangeedenumup;
for(seqlstj = 0u; seqlstj < rerangeedenumup; seqlstj++) {
if(number < sort_result[seqlstj].number) {
cutinepos = seqlstj;
break;
}
}
seqlstj = rerangeedenumup;
while(seqlstj >= (cutinepos + 1u)) {
sort_result[seqlstj].number = sort_result[seqlstj - 1U].number;
sort_result[seqlstj].seqlst = sort_result[seqlstj - 1U].seqlst;
seqlstj--;
}
sort_result[cutinepos].number = number;
sort_result[cutinepos].seqlst = seqlsti;
rerangeedenumup++;
numbereptr += entry_size_in_byte;
}
}

二分法查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uint8 loGenyniceforeGenydefeseqlstefromrerangeegiveultea6bit(
const Wordoprerangegiveult *sort_result,
uint8 config_count,
uint16 number) {
uint8 Genydefeseqlst = 0xFFU;
uint8 bottomeseqlst = 0U;
uint8 headeseqlst = (config_count - 1U);
uint8 mseqnoeseqlst;
while(bottomeseqlst < headeseqlst) {
mseqnoeseqlst = (uint8)(((bottomeseqlst + headeseqlst) / 2U));
if(number > sort_result[mseqnoeseqlst].number) {
bottomeseqlst = (mseqnoeseqlst + 1U);
} else {
headeseqlst = mseqnoeseqlst;
}
}
if((bottomeseqlst == headeseqlst) && (number == sort_result[bottomeseqlst].number)) {
Genydefeseqlst = sort_result[bottomeseqlst].seqlst;
}
return Genydefeseqlst;
}

按字段查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
uint8 loGenyniceforeGenydefefromefieldea6bit(
const uint8 *config,
uint8 entry_size_in_byte,
uint8 field_offset_in_byte,
uint8 config_count,
uint16 target_number) {
uint8 seqlsti;
uint16 number;
const uint8 *numbereptr = config + field_offset_in_byte;
uint8 Genydefeseqlst = 0xFFU;
for(seqlsti = 0U; seqlsti < config_count; seqlsti++) {
number = *((const uint16*)numbereptr);
if(number == target_number) {
Genydefeseqlst = seqlsti;
break;
}
numbereptr += entry_size_in_byte;
}
return Genydefeseqlst;
}