Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > тип unsigned char[N]


Автор: zss 22.4.2007, 22:40
есть массив байт фиксированного размера N.
Для удобной работы я использовал вектор

Код

typedef std::vector <unsigned char> MyBuffer;


но приходится работать и с читыми массивами, что приводит к постоянному преобразованию 
unsigned char[] <--> std::vector<unsigned char>.

Кроме того у типа MyBuffer нет проберки на корректность границ.
Но с другой стороны хотелось бы с новым типом работать как с вектором
Решил немного облегчить себе жизнь. Что проще сделать
1. Немного подправить класс std::vector
2. Реализовать собственный с проверками размером, функциональностью std::vector (правда не совсем понятно как
ее целиком перенести), и с оператором преобразования типа

Тоесть хочется прозрачно работать с новым типом как с std::vector так и неавно преобразовывать
его в массив байт и обратно.

Автор: Daevaorn 22.4.2007, 22:44
Цитата(zss @  22.4.2007,  23:40 Найти цитируемый пост)
есть массив байт фиксированного размера N.

boost::array
Цитата(zss @  22.4.2007,  23:40 Найти цитируемый пост)
но приходится работать и с читыми массивами, что приводит к постоянному преобразованию 

Код

typedef std::vector <unsigned char> MyBuffer;
MyBuffer buf;
unsigned char* raw = &*buf.begin();
raw = &buf[ 0 ];

Цитата(zss @  22.4.2007,  23:40 Найти цитируемый пост)
Кроме того у типа MyBuffer нет проберки на корректность границ.

std::vector::at

Автор: zss 22.4.2007, 22:48
Цитата(Daevaorn @  22.4.2007,  22:44 Найти цитируемый пост)
boost::array

не - вектор подходит более



Цитата(Daevaorn @  22.4.2007,  22:44 Найти цитируемый пост)
std::vector::at 

я имею ввиду при создании вектора я могу создать его любого размера. А нужно гарантировать размерность = N


Цитата(Daevaorn @  22.4.2007,  22:44 Найти цитируемый пост)
typedef std::vector <unsigned char> MyBuffer;
MyBuffer buf;
unsigned char* raw = &*buf.begin();
raw = &buf[ 0 ];

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

Хотелось бы еще избавиться от явных преобразований

в псевдокоде что-то вроде
Код

class Buffer {
private :
    std::vector<unsigned char> m_buffer;

public :
    static const std::size_t SIZE = 10;

    Buffer () : m_vector (SIZE, 0) {};
    Buffer (unsigned char buffer[SIZE]) : m_vector (buffer, buffer + sizeof(buffer)) {};

    operator unsigned char[SIZE] ()
    {
        return &m_vector[0];
    }
}


Автор: Daevaorn 22.4.2007, 22:52
Тогда не очень понятно зачем тебе вообще вектор, если он у тебя имеет статический размер. Простой boost::shared_array тогда, как мне кажется, может тебе помочь. И проблем с конвертацией нет

Автор: zss 22.4.2007, 22:53
Цитата(Daevaorn @  22.4.2007,  22:52 Найти цитируемый пост)
Тогда не очень понятно зачем тебе вообще вектор, если он у тебя имеет статический размер

для использования его функционалности - сравнения, хранени в контейнерах и т.д.


Цитата(Daevaorn @  22.4.2007,  22:52 Найти цитируемый пост)
Простой boost::shared_array тогда, как мне кажется, может тебе помочь. И проблем с конвертацией нет 

например...

Автор: 88andrey 23.4.2007, 10:09
 Можно узнать, если создать
 
Код

unsigned char *str;

то как выдедять память
Код

str = new char [ 10 ];

или
Код

str = new unsigned char [ 10 ];

 

  
  

Автор: JackYF 23.4.2007, 18:03
Логично, что

 
Цитата(88andrey @  23.4.2007,  10:09 Найти цитируемый пост)
str = new unsigned char [ 10 ];


Автор: dizzy1984 24.4.2007, 18:06
Не имеет значения.
Разница сводится к тому будет ли приводится тип указателя, возвращаемый оператором new

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)