Сдвиг массива без цикла for или while

Страницы: 1
RSS
Сдвиг массива без цикла for или while, Возможно ли сдвинуть массив без цикла for или while, если количество строк массива может изменяться?
 
Подскажите, пожалуйста, для понимания вот полный код:
time_0=0
time_now=0
Price={}--массив сумм цен инструмента
--всего в массиве пусть для примера будет 5 строк:
max_rows_arr_Price=5
--в каждой строке массива сохраняется сумма сделок за 30 секунд
n_sec=30
--счетчик строк
n_rows=0
--============================================================­====================================
function OnAllTrade(alltrade)
    if alltrade.sec_code==instr1 then
         time_now=os.date("%X")
         local t1=os.time(Vremya_v_tablicu(time_now))
         local t2=os.time(Vremya_v_tablicu(time_0))
         if os.difftime(t1,t2)>=n_sec or t1.min~=t2.min or time_0==0 then
         n_rows=n_rows+1
         time_0=os.date("%X")
         if max_rows_arr_Price <= 2 then
              Price[n_rows]=alltrade.price
         else
              --!И ВОТ ЗДЕСЬ НУЖНО ПРОПИСАТЬ КОД КАК СДВИНУТЬ МАССИВ НА 1 СТРОКУ ЖЕЛАТЕЛЬНО БЕЗ ЦИКЛА FOR???

         end
    else
         Price[n_rows]=Price[n_rows]+alltrade.price
    end
    end
end
--============================================================­====================================
--c этой пользовательской функцией мне легче выполнять операции со временем
function Vremya_v_tablicu(priem)
    priem=tostring(priem)
    local otpravka=os.date("!*t",os.time())
    local len=string.len(priem)
    if len>6 then
         otpravka.hour,otpravka.min,otpravka.sec=string.match(priem,"(%d%d)%p(%d%d)%p(%d%d)")
    elseif len==6 then
         otpravka.hour,otpravka.min,otpravka.sec=string.match(priem,"(%d%d)(%d%d)(%d%d)")
    elseif len==5 then
         otpravka.hour,otpravka.min,otpravka.sec=string.match(priem,"(%d)(%d%d)(%d%d)")
    end
    return otpravka
end
--============================================================­====================================
 
Цитата
Айдар написал:
if max_rows_arr_Price <= 2 then
if max_rows_arr_Price <= max_rows_arr_Price then
 
Цитата
Айдар написал:
if max_rows_arr_Price <= 2 then
if  n_rows<=max_rows_arr_Price then
поправочка
 
Если это именно массив, то помогут функции table.insert и table.remove
 
Айдар, Чисто алгоритмически сдвинуть массив без цикла проще простого: это либо вставка элемента либо его удаление. Если массив не отсортирован по какому-либо признаку, то добавлять новый элемент нужно всегда в конец, а при удалении текущего ставить последний элемент на его место и уменьшать размер массива на единицу. Если же требуется поддерживать существующую сортировку, без цикла обойтись невозможно. Точнее, невозможно, если данные организованы именно в виде массива, а не списка - там достаточно поправить нужным образом указатели.

Код не смотрел, но глаз сразу зацепился за OnAllTrade. Насколько я помню, это прерывание, причём очень глючное и страшно тормознутое, так что внутри него ваапще ничего делать категорически нельзя (а лучше не использовать вообще).
 
Nikolay, Не помогут. :smile:  
 
И очень странная работа с временем. Если необходимо получить разницу времени, то у Вас есть unix-time, простое арифметическое действие даст разницу в секундах.
Также время есть и в параметре alltrade - время прошедшей сделки. И да, в этом колбеке выполнять что-то сложное - очень плохо.
 
Цитата
Владимир написал:
Nikolay, Не помогут. ::  

Сдвинуть помогут. Вопрос был про сам сдвиг. Давить в конец, удалить в начале. Как я понимаю задача держать в массиве заданное число элементов.
Правда эту задачу можно решить кольцевым массивом, рассчитывая очередное место индекса массива через остаток от деления, например.
 
Nikolay, Нет, вопрос был про сдвиг без цикла. А это либо добавление в конец, либо цикл, но "написанный дядей Васей" внутри этих функций. И кольцевой массив здесь не поможет - это просто очередь (так, например, обрабатываются прерывания от клавиатуры).
 
Цитата
Айдар написал:
Подскажите, пожалуйста, для понимания вот полный код:
Например так:
---------------------------
table.remove(t,1)  
Страницы: 1
Читают тему
Наверх