用模数循环一个数组子部分?

时间:2011-10-20 11:27:03

标签: c

我有一个大数组,并且有许多操作循环遍历它的最后N个元素,其中N在每种情况下都是不同的。每个都有一个索引变量,每个索引都以不规则的间隔更新,此时它的位置增加一个元素。 (该数组是一个音频缓冲区,操作正在复制它的不同部分以输出)。

因此不可能使用正常的循环结构。

以前,我循环遍历整个数组,因此每次更新索引时,我都可以使用数组长度的mod操作简单地测试其值,并在必要时重置。我认为我需要类似的东西,但要将索引重置为(array_size - N),而不是归零。

我确信这有一个简单的解决方案 - 对不起,如果我错过了那么明显的问题!

4 个答案:

答案 0 :(得分:3)

// loop over last N 

sometype array[maxsize];

for (sometype* p = array + maxsize - N; p < array + maxsize; ++p)
{
 ...
}

答案 1 :(得分:1)

for( unsigned int i = std::max( 0u, array.size() - N ); i < array.size(); ++i )

答案 2 :(得分:1)

从最后开始的for循环怎么样,例如:

for ( int i = array_size; (i >= 0) && (i >= (array_size - N)); i-- )
    operation( array[i] );

除非我不能正确理解你的问题,否则你可能不需要这样的模运算符。

答案 3 :(得分:0)

如果您知道数组的长度,这很容易

int L=length;
int* array;

int* start=array+length-N;
for(i=0;i<N;i++){
   doSomething( start[i] );
}

如果您正在寻找模运算符,请使用%

int i=0;
while(condition){
  i++; i%=N; // increment i, modulo N
}