这种情况经常出现。循环遍历数组,如果某些元素满足某些要求,您希望稍后跟踪它们的索引。这就是我的意思:
for(i=0;i<10;++i)
{
if(array[i] > 10)
{
//Keep track of this index for later use.
}
}
简单的解决方案是创建一个包含10个元素的数组,如果说第二个元素大于10,则可以做index [i] = 1;但我觉得这种做法不太好。我需要一个大型数组来存储它,大部分空间都被浪费了。
在我的应用程序中,我试图找到位数组中的哪些位。因此,如果设置了位0和10,我需要存储这些数字以供程序以后使用。什么是最好的方法呢?
此代码需要在AVR Mega上运行,而我正在使用AVR-GCC,因此只需要一个C解决方案。
答案 0 :(得分:3)
您可以使用位图:每个索引只使用1位,而不是每个索引使用16位或32位。
uint32_t bitmap[10] = {0}; // works for array size up to 320 elements
for(i=0;i<10;++i)
{
if(array[i] > 10)
{
//Keep track of this index for later use.
bitmap[i/32] |= (uint32_t)1 << (i%32);
}
}
for(i=0;i<10;++i)
{
if((bitmap[i/32] >> (i%32)) & 1)
{
// Later use :)
// Put some code here
}
}
答案 1 :(得分:0)
如果您觉得通过使用其他数组来记住“特殊”索引会浪费太多空间,请尝试确定浪费多少空间。然后,使用较小的数组。例如,如果您知道必须记住最多4个索引,则声明一个大小为4的数组。
你也可以声明一个小数组,不足以记住所有索引,并运行多次填充它的循环:
int indices[4];
int number_of_indices = 0;
int i_start = 0; // array entries up to this index were already checked
while (i_start < 10) {
for(i=i_start;i<10;++i)
{
if(array[i] > 10)
{
//Keep track of this index for "later use" below.
indices[number_of_indices++] = i;
// If 4 indices have been gathered, break the loop and use them
if (number_of_indices == 4)
{
break;
}
}
}
i_start = i;
// Put "Later use" here :)
// Do something for the list of indices gathered so far
}
答案 2 :(得分:0)
在PC上,我会说动态增长的链表或堆栈最好。
在微控制器上,通常最好使用静态分配的结构,以便性能具有确定性并避免浪费宝贵的内存。因此,存储您关注的索引(而不是简单的1/0状态)的固定大小FIFO是可行的方法。如果出现溢出,请准备考虑检测和优雅失败或找到某种方法来保证不会溢出。