2016-12-07 2 views
0

Когда нам нужно удалить некоторые элементы внутри очереди, мы можем легко писать код, как показано ниже:удалять элементы очереди внутри Еогеасп цикла

foreach(queue[i]) begin 
    if(queue[i].value == 1) 
     queue.delete(i); 
end 

Но есть ошибки в коде выше, когда очередь [0] == очереди [1] == 1. Поскольку queue.delete (0) изменит все индексы элементов внутри очереди.

Так в настоящее время я использую код, как показано ниже:

foreach(queue[i]) begin 
    if(queue[i].value == 1) begin 
     queue.delete(i); 
     i--; 
    end 
end 

Это работает, но это выглядит запутанным на первый взгляд.

Так что мой вопрос: Есть ли лучшее решение для этой проблемы в системном verilog?

+1

Решение в [этот вопрос] (http://stackoverflow.com/questions/30494550/how-to-match-and-delete-an-element-from-a-queue) не работает для меня. Аналогичное решение может быть реализовано с использованием цикла 'repeat':' repeat (q.size()) begin if (q [i] == 1) q.delete (i); i ++; end'. Обратите внимание, что итератор в цикле 'repeat' является постоянным, даже если размер очереди меняется. – sharvil111

+0

@ sharvil111 В моем первоначальном вопросе была опечатка. Я изменил его, и теперь он должен работать. – awill

+0

В моем предыдущем комментарии я указал на аналогичный вопрос. Вот простая ссылка на этот вопрос: http://stackoverflow.com/questions/30494550/how-to-match-and-delete-an-element-from-a-queue – sharvil111

ответ

0

Я считаю, что это должно работать (я не могу проверить это прямо сейчас. Убедитесь, что порядок выстоял при попытке его)

queue = queue.find() with (item.value != 1); 

Другой подход должен был бы найти все индексы, которые отвечают вашим критерии, сортировки в зависимости от порядка, а затем перебрать индексы

int qi[$] = queue.find_index() with (item.value == 1); 
qi = qi.sort() with (-item); // sort highest to lowest 
foreach(qi[idx]) queue.delete(qi[idx]); 

См IEEE1800-2012 § 7,12 методы манипуляции массива для деталей

Смежные вопросы