Сдвиг массива.
- Войдите на сайт для отправки комментариев
Вс, 29/08/2021 - 01:07
Здравствуйте, есть масив вида (0,1.2.3.4.5.6). Размерности 10. Заполняется он постоянно значениями analogRead (0), скажем, раз в секунду по таймеру. И должен принять вид (1.2.3.4.5.новое значение из analogRead (0). Но размерность всегда 10. Задайте пожалуйста направление, код не прошу, но буду благодарен.
Бери да сдвигай значения, в чем проблема-то? array[0] = array[1]; и так далее.
Благодарю!
Все хорошо, кроме одного момента. Поначалу массив пустой, выводит нули.
если заменить
на
то заполняет сразу, но сдвига не происходит, массив заполнен значениями которые идут из порта.
array[10]=analogRead(0);
Вылез за границу массива. И не только тут
Да, понял ошибку. При объявлении указываем размерность 10. При обращении к 10му элементу [9]. Я обращался в неизвестную ячейку памяти.
И еще в условии получается?
исправить на 9, так?
И еще в условии получается?
исправить на 9, так?
нет, в условии не надо
Только все равно никакого сдвига у вас в коде нет.
Это не так делается, почитайте про кольцевой буфкр
И еще в условии получается?
исправить на 9, так?
Как ты определил, что "это"?
И еще в условии получается?
исправить на 9, так?
Как ты определил, что "это"?
а что там определять, считывать надо в переменную иначе идёт потеря последнего элемента массива и потом сдвигает только один элемент. а надо все
А зачем его сдвигать? Обычно сдвигают не сам массив, а указатели на начало и на конец. Например, вот готовая библиотека для кольцевого буфера
А зачем его сдвигать? Обычно сдвигают не сам массив, а указатели на начало и на конец. Например, вот готовая библиотека для кольцевого буфера
можно пример применения?
Функции, определенные в декларации класса, являются inline по умолчанию.
Функции, определенные в декларации класса, являются inline по умолчанию.
Это Вы меня поучить решили? Спасибо.
можно пример применения?
Да. можно.
Только реализация всё равно ублюдочная.
Во-первых непонятно для чего сделано "реальный размер на 1 меньше", а во вторых, если это использовать как буфер, то явно не хватает методов peek и unget, а если использовать как массив, то очевидно не хватает метода взятия элемента по индексу.
Только реализация всё равно ублюдочная.
Во-первых непонятно для чего сделано "реальный размер на 1 меньше", а во вторых, если это использовать как буфер, то явно не хватает методов peek и unget, а если использовать как массив, то очевидно не хватает метода взятия элемента по индексу.
Вот тока хотел написать про индекс, но подумал, что творение твое и не стал расстраивать... а оно вона как!
ТС нужно простое решение, вариант на практике не проверял.
Только реализация всё равно ублюдочная.
Во-первых непонятно для чего сделано "реальный размер на 1 меньше", а во вторых, если это использовать как буфер, то явно не хватает методов peek и unget, а если использовать как массив, то очевидно не хватает метода взятия элемента по индексу.
Вот тока хотел написать про индекс, но подумал, что творение твое и не стал расстраивать... а оно вона как!
неееееее... в коде Евгения я бы разобрался )))
Это Вы меня поучить решили? Спасибо.
Ты тоже из дебилов по убеждению? Ок, буду знать.
Может всё же как-то так: memmove(&array[0], &array[1], (sizeof(array)/*array)-1) ?
Ты тоже из дебилов по убеждению? Ок, буду знать.
Это Ваша реакция на благодарность? На слово "спасибо"? Ок, буду знать.
Блин, зашел форум почитать... Вот мне интересно, почему одного представителя "высшей рассы" забанили, а его коллегу - нет. Несправедливо...
Блин, зашел форум почитать... Вот мне интересно, почему одного представителя "высшей рассы" забанили, а его коллегу - нет. Несправедливо...
ты апчом? ... нуи, шоп два раза не вставать, в слове "раса" адна буква "Сы".
Ты тоже из дебилов по убеждению? Ок, буду знать.
Это Ваша реакция на благодарность? На слово "спасибо"? Ок, буду знать.
я давно говорил, что му..ка нужно банить. Это Дет у нас добрый, нашел грамотность у клоуна.
Это не грамотность, а занудство и мания величия.
У меня уже коллекция "грамотностей", я собираю, хобби такое.
Блин, зашел форум почитать... Вот мне интересно, почему одного представителя "высшей рассы" забанили, а его коллегу - нет. Несправедливо...
ты апчом? ... нуи, шоп два раза не вставать, в слове "раса" адна буква "Сы".
Помнишь клапа под каким последним номером был? А ркита знаешь?)))
Помнишь клапа под каким последним номером был? А ркита знаешь?)))
я как бы не из фан-клуба Ркита, но нацистской символики у него не видел. Клапу выгнали по моему настоянию именно за нацистскую символику. Я что-то пропустил?
Влад, считаю, что человек, обзывающий всех подряд прямо или косвенно дебилами, этим причисляет себя к "высшей расе". Нацизм это или психиатрия не знаю.
Не понял, а что ркита кто-то забанил? Я что-то пропустил?
По мне, так особо не за что. Хамло, так всегда им был - не новость. Что изменилось-то?
Не понял, а что ркита кто-то забанил? Я что-то пропустил?
По мне, так особо не за что. Хамло, так всегда им был - не новость. Что изменилось-то?
- Ви баните Ркитов?
- Нет, только показываю.
- Занятное.
Не понял, а что ркита кто-то забанил? Я что-то пропустил?
По мне, так особо не за что. Хамло, так всегда им был - не новость. Что изменилось-то?
Забанить бы неплохо. Исключительно в целях воспитания. Для его же блага. Для начала на недельку.
Забанить бы неплохо. Исключительно в целях воспитания. Для его же блага. Для начала на недельку.
Ну как бэ... Это такая изюминка форума. Я всерьез его наезды не воспринимаю и вам советую :) Говорят же "в семье не без урода". Правильно же сказали, хамло. Практически в любом дворе старых спальных районов Москвы есть такие кадры, у них всегда морда битая :)
И клоп был бы не плох, если бы не перегибал палку. Но с Дракулой я полностью согласен.
безотносительно ркита...
право называть дебилов дебилами - одна из отличительных особенностей форума, за которую я готов голосовать двумя руками. Но если ты назвал кого-то дебилом и не смог этого подтвердить - значит сам дебил и есть.
Но если ты назвал кого-то дебилом и не смог этого подтвердить - значит сам дебил и есть.
+100500
Всем отписавшимся по делу, огромное спасибо!
По поводу разборок, вы б##дь профессионалы, а ведете себя, как мудаки полные. За те пару лет, что я изредка заходил на форум, он скатился в говно, до уровня оскорблений и выяснения кто дебил кто нет. Вы на мой взгляд, умнейшие люди, так с#ка держите марку.
И снова по делу.
Возможно моя задача решается проще. Но основании библиотеки UTFT задумал сделать график температуры от датчика, чтение раз секунду например, с отображением на экране. План был такой, собираю 320 значений (по ширине экрана), рисую что получилось, и как только получаю последнее значение массива, закрашиваю все черным, сдвигаю массив на одно значение, рисую снова красным (на черном фоне). Таким образом получаю картинку "а-ля осциллограф". Используя DUE, теоретически скорости должно хватить. Библиотеки готовой я не нашел, может искал плохо конечно. Поправьте меня, или натолкните на альтернативное решение. Спасибо.
мне проще на страничке смотреть и доступ отовсюду
Отличный вариант, но устройство должно быть мобильным (используется для диагностики). Такую картинку вполне реально нарисовать и на экране, я полагаю.
Для вашей задачки не требуется "сдвигать массив". Вам уже сказали - используйте кольцевой буфер. Или вы готового кода ждете?
Отличный вариант, но устройство должно быть мобильным (используется для диагностики). Такую картинку вполне реально нарисовать и на экране, я полагаю.
Буфер на десять значений всего. Кольцевой организовывать - из пушки по воробьям. Да еще невесть с каких либ - чужой код отлаживать. Здесь прямой сдвиг через мув самое оно, см. #19. Да хоть своим циклом - тоже не грешно. Особенно если этот цикл уже есть для вывода графика.
Ресурсов на хотелку хватит на любой ардуине, но не злоупотребляйте числами с плавающей запятой.
То, что ua6em пишет - тоже верно, web-интерфейс как правило предпочтительней, экран спецом не нужен становится, а смотреть на мобилке, планшете, ПК, т.е. везде где браузер удобней и функциональней. Картинку можно и сохранить, и вайбером отослать. Причем это сразу и есть, кодить ниче не надо..
Кольцевой организовывать - из пушки по воробьям.
для тебя кольцевой буфер - это что-то из разряда космических технологий? он пишется на коленке за 10 минут, там буквально 10-15 строк.
Реально все ваши советы со сдвигном массива - по сути делают то же, что и кольцевой буфер, только криво и некрасиво. И кода не сильно меньше.
Если нее нравится термин "кольцевой буфер", можно использовать "очередь".
Если нее нравится термин "кольцевой буфер", можно использовать "очередь".
надеюсь короткая? а то патроны нынче дорогие )))
Кольцевой организовывать - из пушки по воробьям.
для тебя кольцевой буфер - это что-то из разряда космических технологий? он пишется на коленке за 10 минут, там буквально 10-15 строк.
Реально все ваши советы со сдвигном массива - по сути делают то же, что и кольцевой буфер, только криво и некрасиво. И кода не сильно меньше.
Ну тебе космические- пусть будут тебе космические. 10 минут - ну напишешь за десять, верю. А за сколько строку из #19? За десять секунд. Нахрена писать более сложное, даже если лично ты его доблесно освоил? Беда ограниченного личного опыта в том, что единожды найденное решение начинают пихать во все ситуации, даже туда куда не нужно и не лезет. Не делай так.
Все определяется задачей. Буфер на 10 элементов - сдвиг. И пишется быстрей и обработка проще. Хочешь спорить - ну напиши хотяб сортировку пузырьком для обоих случаев. Оценим объем кода, расход памяти, скорость работы... Были бы в задаче несколько десятков-несколько сотен элементов, да расклад бы поменялся, кольцевой бухер бы рулил. А может и список односвязный или еще чего. По требованиям задачи все.
Если нее нравится термин "кольцевой буфер", можно использовать "очередь".
А это не совсем синонимы. Очередь скорей логический термин и кольцевой бухер только одна из технологий реализации очереди. Списки, например, другая.
Logik ТС потом написал: "План был такой, собираю 320 значений (по ширине экрана)...".
Logik ТС потом написал: "План был такой, собираю 320 значений (по ширине экрана)...".
Выделено мной. А вопрос содержал четко "Размерности 10". У меня тоже когда-то план был стать зам министра )))
Сдвинуть 10 байт на одну позицию это (1+1)+(1)+10*((2+2+1)+1) = 54 такта на AVR. Пояснять надо? Я специально скобками выделил.
загрузка адреса, загрузка счетчика "10", 10 шагов по 5 тактов: прочесть, сохранить, проверить счетчик, на последнем шаге еще плюс такт на выход из цикла.
Так вот Логик, по твоему предложению выходит дополнительно 3.5 мкс на каждую операцию записи.
При кольцевом буфере нужно и на чтение и на запись прочесть смещение - 2 такта, сложить и наложить маску - еще по такту (маска если длина буфера - степень двойки, а так всегда можно сделать - не 10, а 8 или 16). 4 дополнительных такта или 0.25 мкс.
Для меня решение очевидно 4 такта на каждую операцию или 54 на каждую запись (и ноль дополнительных на чтение). Если развернуть цикл, то можно 54 уменьшить до 42. Все равно много.
Ты часто прав в замене сложного кода на "брут-форс", но тут, уже от 8 значений, я бы выбрал буфер, ессно длиной в степень двойки, чтобы не считать остатки от деления. 10 байт рукам двигать или сделать одну переменную смешения и буфер в 16 позиций? Хотя, конечно, "каждый дрочит, как он хочет" (с).
Тяп ляп подсчёты. Код, дизасм? Для добавления,значения, для выборки, с контролем границ, без фантазий про всегда можно к степени двойки. Не всегда. ТС спросил про 10 элементов, значить не 8, и не 16 и не 320.
По цифрам - сплошная у тя лажа, начиная от того что сдвигаются 9 элементов при добавлении 10-года и заканчивая тем, что при встраивании в цикл перебора, например при отрисовке, очередной элемент все равно извлекается, такты на это учитывать не надо, только на запись в соседний адрес.