Форум: "Основная";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];
ВнизНеобходимо сложить (объединить) два типа pointer Найти похожие ветки
← →
Niko. (2002-07-08 12:23) [0]Помагите пожалуйста. Необходимо сложить (объединить) два типа pointer. Как это выполнить???
← →
Виктор Щербаков (2002-07-08 12:24) [1]Чего?
← →
Skier (2002-07-08 12:25) [2]>Niko
Это как ?! Для чего тебе это нужно ?
← →
kull (2002-07-08 12:29) [3]Поподробнее, пожалуйста...
← →
Niko. (2002-07-08 12:51) [4]К примеру есть два буфера
var Buffer1,Buffer2:Pointer;
И их надо объединить: buffer1+buffer2 - как это сделать.
← →
Skier (2002-07-08 12:53) [5]>Niko
А TMemoryStream.Read и TMemoryStream.Write не подойдёт ?
← →
Anatoly Podgoretsky (2002-07-08 13:32) [6]Почему бы не использовать операцию "+", только суть этого сложения, что должно полезного получиться
← →
Skier (2002-07-08 13:34) [7]>Anatoly Podgoretsky
А я так понимаю ему нужно 2 буфера объединить.
(Судя по разъяснению к вопросу Niko. (08.07.02 12:51) )
← →
Anatoly Podgoretsky (2002-07-08 13:37) [8]Судяя по объяснению, сумма двух указателей, насчет разницы я бы его еще понял, а вот сумма
← →
jonik pegas (2002-07-08 13:40) [9]Создать буфер размеров в 2 прежних буфера GetMem или GlobalAlloc
скопировать оба в новый командой move
← →
Niko. (2002-07-08 13:59) [10]На счет зачем: Допустим я обробатываю буфер 1. Обработанные данные удаляются из буфера. И каждые 50 мсек. мне необходимо дополнять буфер, что бы данные были постоянно в нем. Но за 50 мсек. весь буфер не успевает обработаться. Так мне надо к данным которые еще не обработаны прибавить новые.
>jonik pegas
Да, я создаю буфер размером двух первых и пытаюсь скопировать
из первого и второго примерно так:
Move(Buffer1,Buffer,size1);
Но со вторым проблемнее, ведь надо скопировать в коней буфера,
а если так:
Move(Buffer2,Buffer,size2) - то Buffer будет заполнен данными из буфера 1, а как сделать что бы копирование производилось начиная с конца буфера buffer, т.е надо установить позицию с которой надо заполнять буфер buffer.
← →
valery_f (2002-07-08 14:14) [11]> Niko. (08.07.02 13:59) ...к данным которые еще не обработаны прибавить новые...
Сделай кольцевой буфер с двумя указателями, бегающими по кругу. Первый - на запись, второй - на чтение. В общем, классическая реализация очереди.
← →
Niko. (2002-07-08 14:25) [12]> valery_f
А по подробней.
← →
Skier (2002-07-08 14:36) [13]>Niko
А всё-таки я не понимаю чем тебя MemorySream не устравивает ?
Там ведь можно писать и читать с любой позиции.
← →
valery_f (2002-07-08 16:21) [14]Вообще-то во всех классических книгах по программированию это подробно описано с примерами... (интересно, их хоть кто-то сейчас читает?)
В простейшем случае очередь - это массив, как с ним работать я набросал ниже (надеюсь - читабельно и без глюков :). Можно выделять память динамически, при этом индексы меняются на поинтеры и далее - соответственно. В любом случае, никакого копирования осуществлять не надо (разве что если ты захочешь расширить очередь в процессе работы), т.к. буфер замкнут в кольцо, а указатели бегают по кругу друг за другом.
const seqsize = 100;
var seq: array[0..seqsize-1] of integer;
p_read, p_write: integer;
//инициализация
p_read := 0; p_write := 0;
//пуста ли очередь? да, если оба указателя стоят в одной точке
function IsSeqEmpty: boolean;
begin
Result := p_read = p_write;
end;
//заполнена ли под завязку? да, если указатель на запись стоит
//на одну позицию раньше, чем указатель на чтение
function IsSeqFull: boolean;
begin
Result := (p_write = (p_read-1)) or (p_write = (seqsize-1)) and (p_read = 0);
end;
//запись в очередь
procedure WriteToSeq(value: integer);
begin
if IsSeqFull then raise... //ошибка - очередь переполнена
else begin
//смещаем указатель на одну позицию, потом пишем
inc(p_write); if p_write >= seqsize then p_write := 0;
seq[p_write] := value;
end;
end;
//чтение из очереди
function ReadFromSeq: integer;
begin
if IsSeqEmpty then raise... //ошибка - очередь пуста
else begin
//читаем, затем смещаем указатель
Result := seq[p_write];
inc(p_read); if p_read >= seqsize then p_read := 0;
end;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c