跟踪符合C要求的阵列指标

时间:2011-11-01 19:38:06

标签: c arrays avr-gcc

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

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解决方案。

3 个答案:

答案 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是可行的方法。如果出现溢出,请准备考虑检测和优雅失败或找到某种方法来保证不会溢出。