0

このような状況はかなり頻繁に発生します。配列をループし、いくつかの要素が何らかの要件を満たしている場合、後でそれらのインデックスを追跡したいとします。これが私が意味することです:

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

簡単な解決策は、10 要素の配列を作成することです。2 番目の要素が 10 より大きい場合は、index[i] = 1; を実行できます。しかし、私はこのアプローチはあまり良くないと感じています。これを格納するには大きな配列が必要になり、ほとんどのスペースが無駄になります。

私のアプリケーションでは、ビット配列に設定されているビットを見つけようとしています。したがって、ビット 0 と 10 が設定されている場合は、後でプログラムで使用できるようにこれらの数値を保存する必要があります。これについて最善の方法は何ですか?

このコードは AVR Mega で実行する必要があり、私は AVR-GCC を使用しているため、C のみのソリューションが必要です。

4

3 に答える 3

3

ビットマップを使用できます。これは、インデックスごとに 16 または 32 ビットではなく、インデックスごとに 1 ビットのみを使用します。

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 では、動的に増加するリンク リストまたはスタックが最適であると言えます。

マイクロコントローラーでは、多くの場合、静的に割り当てられた構造体を使用してパフォーマンスを決定論的にし、貴重なメモリを浪費しないようにするのが最善です。したがって、(単純な 1/0 ステータスではなく)関心のあるインデックスを格納する固定サイズの FIFO が適しています。オーバーフローが発生した場合、またはオーバーフローがないことを保証する方法を見つけた場合の検出と正常な失敗について考える準備をしてください。

于 2011-11-01T20:36:19.853 に答える