Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> тип unsigned char[N] 
:(
    Опции темы
zss
Дата 22.4.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



есть массив байт фиксированного размера N.
Для удобной работы я использовал вектор

Код

typedef std::vector <unsigned char> MyBuffer;


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

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

Тоесть хочется прозрачно работать с новым типом как с std::vector так и неавно преобразовывать
его в массив байт и обратно.
PM MAIL ICQ   Вверх
Daevaorn
Дата 22.4.2007, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(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
PM MAIL WWW   Вверх
zss
Дата 22.4.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(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];
    }
}


PM MAIL ICQ   Вверх
Daevaorn
Дата 22.4.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Тогда не очень понятно зачем тебе вообще вектор, если он у тебя имеет статический размер. Простой boost::shared_array тогда, как мне кажется, может тебе помочь. И проблем с конвертацией нет
PM MAIL WWW   Вверх
zss
Дата 22.4.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



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

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


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

например...
PM MAIL ICQ   Вверх
88andrey
Дата 23.4.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



 Можно узнать, если создать
 
Код

unsigned char *str;

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

str = new char [ 10 ];

или
Код

str = new unsigned char [ 10 ];

 

  
  

PM MAIL   Вверх
JackYF
Дата 23.4.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Логично, что

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




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
dizzy1984
Дата 24.4.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



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

Это сообщение отредактировал(а) dizzy1984 - 24.4.2007, 18:08
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.