Перебор подраздела массива с модулем?

#c

#c

Вопрос:

У меня есть большой массив и ряд операций, которые перебирают последние N его элементов, где N отличается в каждом случае. Для каждого из них есть переменная index, и каждый индекс обновляется с нерегулярными интервалами, после чего его позиция увеличивается на один элемент. (Массив представляет собой аудиобуфер, и операции копируют разные его части для вывода).

Таким образом, обычная конструкция цикла невозможна.

Раньше я перебирал весь массив, поэтому каждый раз, когда обновлялся индекс, я мог просто проверять его значение с помощью операции mod, используя длину массива, и при необходимости сбрасывать. Я думаю, мне нужно что-то подобное, но включающее смещение для сброса индекса до (array_size — N), а не до нуля.

Я уверен, что есть простое решение для этого — извините, если я упускаю из виду ослепительно очевидное!

Комментарии:

1. Не могли бы вы показать пример того, что вам нужно? Я не уверен, что понимаю ваш вопрос.

2. Извините, ребята, я понимаю, что плохо задал вопрос, потому что цикл for невозможен. Просто быстро опубликуйте это, чтобы никто больше не тратил свое время — я отредактирую вопрос как можно скорее.

3. Похоже, вы, возможно, выполняете детальный синтез или запускаете множество линий задержки параллельно. Если это так, вам следует тщательно продумать операции, которые вам нужно выполнить, и разработать свой алгоритм, чтобы минимизировать вычислительную сложность. Может быть эффективным иметь один главный цикл и счетчик со многими внутренними счетчиками для каждой звуковой подоперации.

4. Это был очень точный диагноз 🙂 — да, я делаю и то, и другое. И ваше описание главного буфера / счетчика и многих вспомогательных счетчиков — это в значительной степени то, что я пытаюсь сделать, поняв, что несколько буферов плохо масштабируются!

Ответ №1:

 // loop over last N 

sometype array[maxsize];

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

Ответ №2:

Как насчет for цикла, начинающегося с конца, например, так:

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

Вам, вероятно, не нужен оператор modulo для чего-то подобного, если я не правильно понял ваш вопрос.

Ответ №3:

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

?

Комментарии:

1. plz2formatUrPosts! У вас было 2 года и 3 месяца, чтобы научиться.

2. Я только что видел, как вы написали You've . Это правильно грамматически?

3. На самом деле я делал больше, чем публикацию в stackoverflow за эти 2 года и 3 месяца, но я собираюсь приложить усилия в будущем.

Ответ №4:

Если вы знаете длину массива, это легко

 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
}