2015-07-09 2 views
0

У меня есть эта функция, где я использую массив как очередь FIFO (т. Е. Помещаю в него элементы и обрабатываю их с использованием первого в первом порядке). В частности, я называю этот массив MsgQueue, поскольку он содержит сообщения.MATLAB: Индекс Матрицы за пределами допустимого диапазона для удаления

MsgQueue используется, когда новый тзд отправляется (событие), который инициирует выполнение handleMsgSent() метода, который я показать следующим

function handleMsgSent(this, msg) 

     this.MsgQueue = [this.MsgQueue msg]; 

     while(numel(this.MsgQueue) > 0) 
      m = this.MsgQueue(1); 
      this.MsgQueue = this.MsgQueue(2:end); % <----- OPTION A 


      % DO WHATEVER WITH THE MESSAGE 


      %this.MsgQueue(1) = []; % <------ OPTION B 
     end    
    end 

Как вы можете видеть, я ознаменовал код с ВАРИАНТ A и ВАРИАНТ B комментарий. Таким образом, точкой является вариант B, заканчивается ошибка «Матричный индекс за пределами диапазона для удаления», а опция A работает (по-видимому) совершенно нормально, без ошибок.

Может ли кто-нибудь помочь мне разобраться в различии? Ну, я понимаю, что опция A не удаляет ничего, кроме просто «отбрасывания» первого элемента массива, но почему опция B не удается удалить, если есть хотя бы один элемент в MsgQueue?

ответ

0

Для пустого массива end является 0. Если вы проверите документацию для оператора двоеточия, для начала> end он возвращает пустой массив. Таким образом, первый параметр удаляет примечание в некоторых случаях, в то время как второй параметр всегда индексирует второй элемент.

+0

Я не знаю, правильно ли я понял, но дело в том, что если я вхожу в цикл while, это потому, что MsgQueue имеет как минимум 1 элемент. Итак, я должен удалить первый элемент массива, верно? – rutex

0

После отладки моего кода я, похоже, понял причину. В моем коде есть комментарий:

% DO WHATEVER WITH THE MESSAGE 

Проблема заключалась в том, что в этот момент я был вызовом другого метода, который вызвал новые сообщения для отправки и, таким образом, введя метод handleMsgSent() снова. Таким образом, когда я дорабатываю MsgQueue до этого, у меня нет проблем, но когда я это делаю, то у меня возникают проблемы.