#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
}