Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-57943
Юра
2002-06-25 15:36
2002.07.18
Вывести в QReport две таблицы


1-58081
Yuri Btr
2002-07-08 11:27
2002.07.18
ScrollBar и GroupBox


1-58125
Alex
2002-07-08 19:51
2002.07.18
OnMinimize


1-58082
Wetnose
2002-07-08 08:15
2002.07.18
Delphi+Java


1-58055
Dimich1978
2002-07-08 08:52
2002.07.18
TreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский