реклама на сайте
подробности

 
 
> Закольцевать данные, программа на Си
Dubov
сообщение Jun 3 2014, 05:09
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Имеется буфер длины N
имеется подпрограмма, принимающая на вход указатель на блок данных длины N.

Буфер заполняется циклически (по заполнении буфера, новый отсчёт поступает в начало буфера).

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

Как закольцевать адресацию массива?

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

| (a) ( b ) (PTR) (...) (N) |

тогда подпрограмма должна "знать", что она оперирует с массивом | (PTR) (...) (N) (a) ( b ) |

Сообщение отредактировал Dubov - Jun 3 2014, 05:10
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
menzoda
сообщение Jun 3 2014, 05:59
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530



Вместе с указателем на данные передавать указатель на начало и конец массива?
Go to the top of the page
 
+Quote Post
Dubov
сообщение Jun 3 2014, 06:38
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(menzoda @ Jun 3 2014, 14:09) *
Вместе с указателем на данные передавать указатель на начало и конец массива?

допустим, функция кроме указателя на начало данных получила указатель на начало и конец массива. Как это обработать на Си, чтобы за концом массива, брались данные из начала?

Пока что я думаю завести переменную счётчик, чтобы знать положение PTR в массиве, когда вызывается функция обработки, копировать данные в другой массив, той же длины с учётом счётчика.

Как то так:

j = count;

for(i = 0; i <= N-1; i++)
{
array_dest[i] = array_src[j];
j++;
if(j == N)
j = 0;
}



где count = это положение самого "свежего отсчёта" в массиве array_src. таким образом, мы получим в массиве array_dest всегда данные начиная с самого свежего элемента исходного массива.

Такой подход самый тупой и, что называется, в лоб.
мне думается, что он будет самым затратным из возможных, и для реалтаймовых задач нерациональным.

Цитата(mempfis_ @ Jun 3 2014, 14:12) *
Функция getArray() возвращает или-1 если нет данных, или данные
Код
signed int getArray(void)
{
signed int res = -1;
if(head == tail) return res; //нет данных - возвращаем -1
res = buff[tail];
tail++;
if(tail >= BUFF_SIZE) tail = 0;
return res; //возвращаем данные

}


Эти 2 процедуры позволяют организовать FIFO данных без проверки переполнения буффера.
Если Вам критично отслеживать переполнение, то всегда можно ввести переменную status, которой можно присваивать статусы empty/not_empty/full
Также довольно легко вместо данных, возвращать указатели на данные.


не понимаю, ну получил я указатель на данные в буфере. Функция обработки берёт по указателю N байт (по сути весь массив с началом в указателе) и если указатель пришёлся на конец буфера, то функция возьмёт данные где-то пределами массива.
В идеале мне нужна циклическая адресация, чтобы за концом массива шло начало в адресном пространстве.

rolleyes.gif

Сообщение отредактировал Dubov - Jun 3 2014, 07:23
Go to the top of the page
 
+Quote Post
menzoda
сообщение Jun 3 2014, 08:18
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530



Цитата(Dubov @ Jun 3 2014, 14:48) *
допустим, функция кроме указателя на начало данных получила указатель на начало и конец массива. Как это обработать на Си, чтобы за концом массива, брались данные из начала?

Так и обрабатывать. В цикле проверять не дошел ли текущий указатель до конца массива, если да, то сдвигаем его в начало массива.
Код
void foo(int *ptr, int count, int *start, int *end)
{
    while(count-- > 0)
    {
        if (ptr >= end)
        {
            ptr = start;
        }

        do_something_with(ptr);    
        ptr++;            
    }
}


Цитата(Dubov @ Jun 3 2014, 14:48) *
Такой подход самый тупой и, что называется, в лоб. Мне думается, что он будет самым затратным из возможных, и для реалтаймовых задач нерациональным.

Собственно других волшебных методов нет. Разве что использовать размер массива равный степени двойки. Тогда можно будет заменить условие на побитовую операцию и присвоение, но даже если это и даст выигрыш, то всего в пару тактов, что будет каплей в море.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dubov   Закольцевать данные   Jun 3 2014, 05:09
|- - megajohn   Цитата(Dubov @ Jun 3 2014, 14:48) В идеал...   Jun 3 2014, 06:42
||- - Dubov   Цитата(megajohn @ Jun 3 2014, 14:52) ну д...   Jun 3 2014, 06:47
||- - _pv   Цитата(Dubov @ Jun 3 2014, 17:57) прошу п...   Jun 3 2014, 07:43
||- - megajohn   Цитата(Dubov @ Jun 3 2014, 14:57) прошу п...   Jun 3 2014, 07:50
||- - mdmitry   Цитата(Dubov @ Jun 3 2014, 14:57) прошу п...   Jun 3 2014, 08:29
- - mempfis_   Цитата(Dubov @ Jun 3 2014, 12:19) Имеется...   Jun 3 2014, 06:02
|- - MaxiMuz   Цитата(mempfis_ @ Jun 3 2014, 13:12) Функ...   Jun 3 2014, 07:30
|- - mempfis_   Цитата(MaxiMuz @ Jun 3 2014, 14:40) Тольк...   Jun 3 2014, 08:13
|- - MaxiMuz   Цитата(mempfis_ @ Jun 3 2014, 15:23) Тогд...   Jun 5 2014, 08:15
|- - megajohn   Цитата(MaxiMuz @ Jun 5 2014, 16:25) тот ж...   Jun 5 2014, 08:24
|- - mempfis_   Цитата(megajohn @ Jun 5 2014, 15:34) авта...   Jun 5 2014, 09:34
|- - menzoda   Цитата(mempfis_ @ Jun 5 2014, 17:44) Тогд...   Jun 5 2014, 15:17
- - Voldemari4   Можно сделать указатель типом BYTE. Если размер ма...   Jun 3 2014, 07:43
- - x893   а может просто код посмотреть ? 1. http://c.learn...   Jun 5 2014, 09:15
- - alexeyv   ЦитатаДа в них и так нет необходимости. Что все пр...   Jun 9 2014, 01:14
|- - Сергей Борщ   Цитата(alexeyv @ Jun 9 2014, 08:24) Видат...   Jun 9 2014, 02:36
- - alexeyv   Цитатано совать его везде "потому что микроко...   Jun 9 2014, 22:27
|- - menzoda   Как раз таки я прекрасно представляю, что будет в ...   Jun 10 2014, 01:47
- - Genadi Zawidowski   ЦитатаТак и обрабатывать. В цикле проверять не дош...   Jun 12 2014, 20:37


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 15:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016