0

这种情况经常出现。您遍历一个数组,如果某些元素满足某些要求,您希望稍后跟踪它们的索引。这就是我的意思:

for(i=0;i<10;++i)
{
     if(array[i] > 10)
     {
          //Keep track of this index for later use.
     }
}

简单的解决方案是创建一个包含 10 个元素的数组,如果说第二个元素大于 10,则可以做 indices[i] = 1; 但我觉得这种方法不是很好。我需要一个大数组来存储它,并且大部分空间都被浪费了。

在我的应用程序中,我试图找出位数组中设置了哪些位。因此,如果设置了位 0 和 10,我需要存储这些数字以供程序以后使用。解决这个问题的最佳方法是什么?

此代码需要在 AVR Mega 上运行,而我正在使用 AVR-GCC,因此需要仅 C 的解决方案。

4

3 回答 3

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
     }
}
于 2011-11-01T20:36:19.207 回答
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
}
于 2011-11-01T20:25:57.600 回答
0

在 PC 上,我会说动态增长的链表或堆栈是最好的。

在微控制器上,通常最好使用静态分配的结构,以便性能具有确定性,并避免浪费宝贵的内存。所以一个固定大小的 FIFO 存储你关心的索引(而不是简单的 1/0 状态)是要走的路。如果有溢出,请准备好考虑检测和正常失败,或者找到某种方法来保证没有溢出。

于 2011-11-01T20:36:19.853 回答