Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > передача указатели с дальнейгим смещением


Автор: leg501 4.6.2008, 07:26
И так есть два потока, первый вычисляет по написаной схеме и складывает результат в буфер ->массив типа short , эти данные нужно передать в другой поток и использовать там некоторюю часть этого массива а точьнее конкретно значения, естественая форма передачи это указатель на это самый массив и вот здесь возникает проблемка чтобы сместить уазатель на нужный мне элемент так как индекс  имеет тип dword, попытки задействовать конструкции типа inc(mass,index) приводят к к ошибке типов, с приведением типов знаком плохо поэтому тоже безрезультатно, на даный момент реализовано так что массив просто копирутся в новый масив во втором потоке ,но этодолго и неэкономичьно .

Автор: Snowy 4.6.2008, 11:16
Что-то не всё ясно.
Во-первых неясно, что естественного в указателе? И зачем указатель двигать?
Не лучше ли передать массив и индекс?
Указатели можно двигать в c++. В дельфи эта операция, хоть и возможна, но штатные средства отсутствуют, т.к. такие вещи неконтролируемы и опасны.
Хотя при желании можно.
Код

var
  p: pointer;
begin
  p := @mass[0];
  p := pointer(integer(p) + 8);
end;

Но не рекомендую. Такие приёмы подразумевают знание внутренних механизмов и устройства Delphi.

Автор: leg501 4.6.2008, 11:55
Цитата



1)Не лучше ли передать массив и индекс?

Указатели можно двигать в c++. В дельфи эта операция, хоть и возможна, но штатные средства отсутствуют, т.к. такие вещи неконтролируемы и опасны.
2) Хотя при желании можно.


1) слишком большой обьем память минимальный размер 64000 типа дворд.


2)насколько я понимаю это смешение на 8 типов интежер?
Код

p := pointer(integer(p) + 8);



мне же нужно сместится на N количество дворд в указателе на масив типа шорт и присвоить это значение переменой.

Код

//
// глобальная переменая получает значения
double Data440[n];
...
//--------------------------------------------------
// другой класс 
int i,k;
double koef;
SHORT *E440_Buffer;
WORD E440_Size;
for..
  for..
  {
    Values440[k] += E440_Buffer[E440_Size + i + k]*koef;
    }
Data440=Values440; 

так это описно в си  E440_Buffer=тоже указатель на масив.  


PS сильно не бейте если написал чтото не так

Автор: Beltar 4.6.2008, 12:31
Цитата

Указатели можно двигать в c++. В дельфи эта операция, хоть и возможна, но штатные средства отсутствуют


В DRKB мне попалась статья об арифметике указателей. Согласно ей операции Inc\dec применимы к типизированным указателям и выполняют смещение адреса на величину базового типа указателя.

Т. е. вот такой код:

Код

procedure TForm1.FormCreate(Sender: TObject);
var P:^Integer;
    m:array[0..2] of integer;
begin
m[0]:=0;
m[1]:=1;
m[2]:=2;
p:=@m[0];
inc(p);
ShowMessage(IntToStr(P^));
end;


Выведет не мусор, а 1.

Цитата

насколько я понимаю это смешение на 8 типов интежер?


Нет, на 8 байт.

2 leg501

Используй просто var параметр.

Автор: Snowy 4.6.2008, 12:41
Цитата(Beltar @  4.6.2008,  12:31 Найти цитируемый пост)
Используй просто var параметр.
Именно.
Массив будет передаваться по ссылке. Дельфи даже не подумает его копировать, дублировать и т.п.
И размер массива тут не играет никакой роли.

Автор: leg501 4.6.2008, 13:14
хм идея нужно попробовать .
тогда такой вопрос оба класса являются потоками один для сбора (двойной буфер) другой для обработки ,невыйдет ли колизий при возможном обращении к одним итемже данным с разной целью(один читает другой записывае )  понятно что нужно попытаться исключить такую ситуацию но всеже. 

Автор: Snowy 4.6.2008, 13:20
Если это 2 разных объекта, то они никак не связаны.
Если ты работаешь с одним объектом (и читаешь и пишешь), то разумеется это повлияет на объект.
А конкретно - произойдёт смещение позиции в потоке, согласно произведённой операции.
Тут уж зависит от целей.
Либо ты работаешь с двумя объектами с разными данными, либо с одним объектом и одним блоком данных.
Не вижу тут проблем - только варианты...

Автор: leg501 4.6.2008, 14:11
чтож буду пробовать варианты) спс что отозвались

Автор: Beltar 4.6.2008, 15:39
Кстати, а зачем тебе 2 потока? У тебя данные непрерывно извне поступают?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)