![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Необходимо сложить (объединить) два типа pointer [D5]
Niko. © (2002-07-08 12:23:00)Помагите пожалуйста. Необходимо сложить (объединить) два типа pointer. Как это выполнить???
valery_f (2002-07-08 16:21:00) [1]Вообще-то во всех классических книгах по программированию это подробно описано с примерами... (интересно, их хоть кто-то сейчас читает?)
В простейшем случае очередь - это массив, как с ним работать я набросал ниже (надеюсь - читабельно и без глюков :). Можно выделять память динамически, при этом индексы меняются на поинтеры и далее - соответственно. В любом случае, никакого копирования осуществлять не надо (разве что если ты захочешь расширить очередь в процессе работы), т.к. буфер замкнут в кольцо, а указатели бегают по кругу друг за другом.
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;
Skier (2002-07-08 14:36:00) [2]>Niko
А всё-таки я не понимаю чем тебя MemorySream не устравивает ?
Там ведь можно писать и читать с любой позиции.
Niko. (2002-07-08 14:25:00) [3]> valery_f
А по подробней.
valery_f (2002-07-08 14:14:00) [4]> Niko. (08.07.02 13:59) ...к данным которые еще не обработаны прибавить новые...
Сделай кольцевой буфер с двумя указателями, бегающими по кругу. Первый - на запись, второй - на чтение. В общем, классическая реализация очереди.
Niko. (2002-07-08 13:59:00) [5]На счет зачем: Допустим я обробатываю буфер 1. Обработанные данные удаляются из буфера. И каждые 50 мсек. мне необходимо дополнять буфер, что бы данные были постоянно в нем. Но за 50 мсек. весь буфер не успевает обработаться. Так мне надо к данным которые еще не обработаны прибавить новые.
>jonik pegas
Да, я создаю буфер размером двух первых и пытаюсь скопировать
из первого и второго примерно так:
Move(Buffer1,Buffer,size1);
Но со вторым проблемнее, ведь надо скопировать в коней буфера,
а если так:
Move(Buffer2,Buffer,size2) - то Buffer будет заполнен данными из буфера 1, а как сделать что бы копирование производилось начиная с конца буфера buffer, т.е надо установить позицию с которой надо заполнять буфер buffer.
jonik pegas (2002-07-08 13:40:00) [6]Создать буфер размеров в 2 прежних буфера GetMem или GlobalAlloc
скопировать оба в новый командой move
Anatoly Podgoretsky (2002-07-08 13:37:00) [7]Судяя по объяснению, сумма двух указателей, насчет разницы я бы его еще понял, а вот сумма
Skier (2002-07-08 13:34:00) [8]>Anatoly Podgoretsky
А я так понимаю ему нужно 2 буфера объединить.
(Судя по разъяснению к вопросу Niko. (08.07.02 12:51) )
Anatoly Podgoretsky (2002-07-08 13:32:00) [9]Почему бы не использовать операцию "+", только суть этого сложения, что должно полезного получиться
Skier (2002-07-08 12:53:00) [10]>Niko
А TMemoryStream.Read и TMemoryStream.Write не подойдёт ?
Niko. (2002-07-08 12:51:00) [11]К примеру есть два буфера
var Buffer1,Buffer2:Pointer;
И их надо объединить: buffer1+buffer2 - как это сделать.
kull (2002-07-08 12:29:00) [12]Поподробнее, пожалуйста...
Skier (2002-07-08 12:25:00) [13]>Niko
Это как ?! Для чего тебе это нужно ?
Виктор Щербаков (2002-07-08 12:24:00) [14]Чего?