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

 
 
> шаблоны класса ring_buffer, channel - гибкость или наоборот?
aliko
сообщение Jun 22 2011, 20:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 23-11-05
Пользователь №: 11 254



В scmrtos используются преимущества С++ в часнтости шаблоны.
например так объявляется шаблон класса кольцевого буфера
Код
template<typename T, uint16_t Size, typename S = uint8_t>
class ring_buffer

аналогично объявляется шаблон класса channel

С одной стороны вроде гибко но с другой...
если у меня есть несколько каналов или кольцевых буферов хранящих тип int но разной длины, то эти каналы уже совершенно разные типы данных, которые нельзя никак объединить, сделать, например, массив указателей на каналы разной длины или нельзя сделать класс включающий указатель на кольцевой буфер заранее не указав длины этого буфера. В итоге вместо гибкости получаем противоположный эффект.

Может есть какое-о просто решение о котором я не знаю, подскажите товарищи!
Уж очень не хочется менять код ОС или дублировать то что там уже написано...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aliko
сообщение Jun 23 2011, 09:36
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 23-11-05
Пользователь №: 11 254



Вобщем вроде как-то так все решается:
Код
usr::ring_buffer<int, 20> ring1;
typedef usr::ring_buffer<int, 1> * ring_ptr;

int _tmain(int argc, _TCHAR* argv[])
{
    ring_ptr pring = reinterpret_cast<ring_ptr>(&ring1);
    ring1.push(1);
    ring1.push(2);
    pring->push(3);
    std::cout << int(pring->get_count()) << std::endl;
    std::cout << pring->pop() << "\t" << pring->pop_back() << std::endl;
    std::cout << int(pring->get_count()) << std::endl;
    return 0;
}


Вывод:
Цитата
3
1 3
1
Для продолжения нажмите любую клавишу . . .


Проверялось в MS Visual C++ 2010.
Было замечено следующее.
если тип указателя задан как
Код
typedef usr::ring_buffer<int, 1> * ring_ptr;

то при попытке положить второй элемент в буфер используя указатель
Код
pring->push(2);

ничего туда не ложится. Именно ВТОРОЙ элемент (при размере буфера указателя 1) должен быть положен напрямую через
Код
ring1.push(2);

а не через указатель, остальные же элементы можно ложить как угодно, хоть напрямую хоть через указатель.

чтобы это обойти надо задать тип указателя как-нибудь так
Код
typedef usr::ring_buffer<int, 100> * ring_ptr;

тоесть задать заведомо бОльший размер буфера у указателя

Вобщем всеравно какие-то костыли получаются...

Сообщение отредактировал aliko - Jun 23 2011, 09:37
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:17
Рейтинг@Mail.ru


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