我想迭代一个包含指向其他数组的指针的数组。
typedef struct {
uint8_t upperLimit, lowerLimit;
} Poi;
Poi poi_new(uint8_t upperLimit, uint8_t lowerLimit) {
Poi i;
i.upperLimit = upperLimit;
i.lowerLimit = lowerLimit;
return i;
}
Poi lox1_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90) };
Poi lox2_POI[] = { poi_new(40,50) };
Poi lox3_POI[] = { poi_new(40,50) };
Poi lox4_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90) };
Poi * pois[] = { lox1_POI , lox2_POI , lox3_POI , lox4_POI };
此时如何迭代pois
然后迭代它指向的任何数组?
我已经开始使用下面的代码了,但是我很容易弄错语法:
for (int c = 0; c++; c < sizeof(*pois[i])) {
//... now to iterate over the internal lists
}
答案 0 :(得分:2)
您可以使用哨兵:即{0, 0}
以了解何时停止迭代:
Poi lox1_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90), {0, 0} };
Poi lox2_POI[] = { poi_new(40,50), {0, 0} };
Poi lox3_POI[] = { poi_new(40,50), {0, 0} };
Poi lox4_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90), {0, 0} };
Poi *pois[] = { lox1_POI , lox2_POI , lox3_POI , lox4_POI };
Poi *ptr;
for (int c = 0; c < sizeof(pois) / sizeof(pois[0]); c++) { /* Note condition in the middle */
printf("%d)\n", c);
//... now to iterate over the internal lists
ptr = pois[c];
while ((ptr->upperLimit != 0) && (ptr->lowerLimit != 0)) {
printf("\t%d %d\n", ptr->upperLimit, ptr->lowerLimit);
ptr++;
}
}
或者您可以创建一个包含这些元素及其大小的表格:
Poi lox1_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90) };
Poi lox2_POI[] = { poi_new(40,50) };
Poi lox3_POI[] = { poi_new(40,50) };
Poi lox4_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90) };
struct poi_table {
Poi *elem;
size_t elems;
} table[] = {
{ lox1_POI, sizeof(lox1_POI) / sizeof(lox1_POI[0]) },
{ lox2_POI, sizeof(lox2_POI) / sizeof(lox2_POI[0]) },
{ lox3_POI, sizeof(lox3_POI) / sizeof(lox3_POI[0]) },
{ lox4_POI, sizeof(lox4_POI) / sizeof(lox4_POI[0]) }
};
for (int i = 0; i < sizeof(table) / sizeof(table[0]); i++) {
printf("%d)\n", i);
//... now to iterate over the internal lists
for (int j = 0; j < table[i].elems; j++) {
printf("\t%d %d\n", table[i].elem[j].upperLimit, table[i].elem[j].lowerLimit);
}
}
输出:
0)
40 50
60 70
80 90
1)
40 50
2)
40 50
3)
40 50
60 70
80 90
答案 1 :(得分:1)
要正常获取数组中元素的数量,可以将数组的大小(例如sizeof pois
)除以单个元素的大小(例如sizeof pois[0]
)。
请注意,这仅适用于实际数组,如果将数组传递给函数,它将衰减为指向数组第一个元素的指针,sizeof
运算符将返回指针而不是它指向的内容。
要在技术上正确,请记住sizeof
表达式的类型是size_t
,因此迭代器变量(示例中为c
)应为{{1}变量。
最后,size_t
语句中表达式的 order 中存在一个非常基本的问题。 for
语句为for
。您已切换for (init; condition; increment)
和condition
。
全部放在一起,迭代increment
你做
pois