Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.18;
Скачать: CL | DM;

Вниз

Необходимо сложить (объединить) два типа 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
14-58295
Sergey13
2002-06-21 11:32
2002.07.18
Предложение по организации форума


1-58226
Alex
2002-07-07 18:56
2002.07.18
DLL


4-58368
nester
2002-05-20 07:22
2002.07.18
Существует ли МИКРОСЕКУНДНЫЙ таймер или sleep()?


1-58221
^Sanya
2002-07-07 02:36
2002.07.18
Мастера! Дайте пожалуйста совет!


4-58360
cult
2002-05-17 17:04
2002.07.18
Системный таймер