Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Необходимо сложить (объединить) два типа 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]

Чего?


Наверх

Титульная страница Поиск, карта сайта Написать письмо