Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Буфер данных

41K
03 августа 2009 года
grrrr
23 / / 23.05.2009
Подскажите [COLOR="Lime"]пожалуйста[/COLOR] как организовать буфер данных.
условия таковы:
=данные распологаються в оп сплошным блоком
=данные добавляються в конец блока
Тоесть списки не подходят.
1.9K
04 августа 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: grrrr
Подскажите [COLOR="Lime"]пожалуйста[/COLOR] как организовать буфер данных.
условия таковы:
=данные распологаються в оп сплошным блоком
=данные добавляються в конец блока
Тоесть списки не подходят.



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

87
04 августа 2009 года
Kogrom
2.7K / / 02.02.2008
stl::vector подойдет:

Цитата:
The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().



Но придется зарезервировать память (reserve), чтобы вектор не переместился в другую область памяти при изменении размера. Ну, в общем, это то, что сказал GreenRiver, но уже реализованное. Поправка: новый резерв создать нельзя - надо сразу резервировать максимальную память, которая может понадобится.

41K
07 августа 2009 года
grrrr
23 / / 23.05.2009
Цитата:
Массив. Резервирования места заранее больше, чем нужно - когда резерв кончается создаем новый побольше и копируем туда старый.


А как тогда сформировать указатель на конец 1 массива (данные добовляються оч часто), если места еще хватает, чтобы добавить данные.

C STL не знаком :o

12K
07 августа 2009 года
Ghox
297 / / 26.07.2009
А на каком языке вам это нужно сделать (или неважно)?
+ учтите, что то что выше написал Kogrom, относится к языку C++ (STL - это библиотека для C++).
Цитата: grrrr
А как тогда сформировать указатель на конец 1 массива (данные добовляються оч часто), если места еще хватает, чтобы добавить данные.


Смысл вопроса как-то неясен... Под "указателем" (на всякий случай хочу уточнить, а то мало ли) вы здесь имеете в виду то же, что называется указателем в C/C++? Если да - то какой указатель вы хотите получить ("сформировать") - указатель на конец всего массива, или указатель на текущую позицию в массиве, на которую можно записать очередную добавляемую в буфер переменную (int, char или что там еще вы собираетесь хранить в вашем буфере), когда массив еще не полон?

41K
08 августа 2009 года
grrrr
23 / / 23.05.2009
Пишу на MSVC++.
Цитата:
вы здесь имеете в виду то же, что называется указателем в C/C++?


Да.

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

12K
08 августа 2009 года
Ghox
297 / / 26.07.2009
Цитата: grrrr
Пишу на MSVC++.

...

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


Тогда алгоритм действий примерно такой:
Создаете массив нужного вам типа (int, char или какой-то другой), такого размера чтобы заведомо хватило;
Создаете указатель на переменную того же типа, что и массив, и приравниваете его адресу начала массива. Этот указатель и будет использоваться в качестве указателя на текущую позицию в массиве;
Далее, после добавления в буфер очередной переменной, смещаете указатель на 1 позицию вверх, но при этом надо проверять, что указатель не вышел за конец массива.
Т.е. что-то наподобие такого:

 
Код:
//инициализация:
  int buf[1000];
  int * bufPtr = buf;

  ...

  //пример добавления одной переменной в буфер (но без проверки на выход за конец массива):
  int n = 100;
  *bufPtr = n; //запись переменной в буфер
  ++bufPtr; //смещение указателя на одну позицию вверх

Но хочу заметить, что массив для создания буфера можно использовать только при условии, что буфер не может быть очень большим. Если буфер может быть большим, то массив использовать нельзя, т.к. он в памяти компьютера создается на стеке (Stack), а размер стека ограничен. Если нужен большой буфер, то память надо выделять из кучи (Heap) - оператор new.
41K
08 августа 2009 года
grrrr
23 / / 23.05.2009
Массив должен быть в куче (размер 50-150мб).
И еще один вопрос:
данные будут добавляться по несколько килобайт.Как можно измеенить указатель(если можно) bufPtr на какое либо число байт без оп.++ в цикле?
12K
08 августа 2009 года
Ghox
297 / / 26.07.2009
Цитата: grrrr
И еще один вопрос:
данные будут добавляться по несколько килобайт.Как можно измеенить указатель(если можно) bufPtr на какое либо число байт без оп.++ в цикле?


Можно с помощью операторов "+" или "+=":

 
Код:
// хотим сместить указатель bufPtr на 1000 позиций вверх:
  // можно так:
  bufPtr = bufPtr + 1000;
  // или так:
  bufPtr += 1000;
  // результат любого из этих вариантов - такой же, как после 1000-кратного выполнения ++bufPtr

Аналогично - можно смещать указатель вниз - с помощью "-" и "-=" (и оператор -- тоже работает).
P.S. А вообще - советую почитать в учебнике по C/C++ про указатели и что с ними можно делать, и при их связь с массивами.
41K
08 августа 2009 года
grrrr
23 / / 23.05.2009
Я знаю допустимые операции с указателями:) но только вот значение указателя не хочет складываться с значением переменной.
12K
08 августа 2009 года
Ghox
297 / / 26.07.2009
Цитата: grrrr
Я знаю допустимые операции с указателями:) но только вот значение указателя не хочет складываться с значением переменной.


А что именно вы пытаетесь сделать? Задавать смещение (на какое количество позиций будет смещаться указатель) не числом, а целочисленной переменной, и потом складывать?
Вот так:

 
Код:
int ptrShift = 1000;
  bufPtr += ptrShift; // эквивалентно bufPtr += 1000;

у меня все работает.
Или вы как-то по-другому делаете?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог