Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача указатели с дальнейгим смещением 
:(
    Опции темы
leg501
Дата 4.6.2008, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.1.2008

Репутация: нет
Всего: 1



И так есть два потока, первый вычисляет по написаной схеме и складывает результат в буфер ->массив типа short , эти данные нужно передать в другой поток и использовать там некоторюю часть этого массива а точьнее конкретно значения, естественая форма передачи это указатель на это самый массив и вот здесь возникает проблемка чтобы сместить уазатель на нужный мне элемент так как индекс  имеет тип dword, попытки задействовать конструкции типа inc(mass,index) приводят к к ошибке типов, с приведением типов знаком плохо поэтому тоже безрезультатно, на даный момент реализовано так что массив просто копирутся в новый масив во втором потоке ,но этодолго и неэкономичьно .
PM MAIL   Вверх
Snowy
Дата 4.6.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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

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

Но не рекомендую. Такие приёмы подразумевают знание внутренних механизмов и устройства Delphi.
PM MAIL   Вверх
leg501
Дата 4.6.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.1.2008

Репутация: нет
Всего: 1



Цитата



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 сильно не бейте если написал чтото не так
PM MAIL   Вверх
Beltar
Дата 4.6.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Цитата

Указатели можно двигать в 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 параметр.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Snowy
Дата 4.6.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Beltar @  4.6.2008,  12:31 Найти цитируемый пост)
Используй просто var параметр.
Именно.
Массив будет передаваться по ссылке. Дельфи даже не подумает его копировать, дублировать и т.п.
И размер массива тут не играет никакой роли.
PM MAIL   Вверх
leg501
Дата 4.6.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.1.2008

Репутация: нет
Всего: 1



хм идея нужно попробовать .
тогда такой вопрос оба класса являются потоками один для сбора (двойной буфер) другой для обработки ,невыйдет ли колизий при возможном обращении к одним итемже данным с разной целью(один читает другой записывае )  понятно что нужно попытаться исключить такую ситуацию но всеже. 
PM MAIL   Вверх
Snowy
Дата 4.6.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Если это 2 разных объекта, то они никак не связаны.
Если ты работаешь с одним объектом (и читаешь и пишешь), то разумеется это повлияет на объект.
А конкретно - произойдёт смещение позиции в потоке, согласно произведённой операции.
Тут уж зависит от целей.
Либо ты работаешь с двумя объектами с разными данными, либо с одним объектом и одним блоком данных.
Не вижу тут проблем - только варианты...
PM MAIL   Вверх
leg501
Дата 4.6.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.1.2008

Репутация: нет
Всего: 1



чтож буду пробовать варианты) спс что отозвались
PM MAIL   Вверх
Beltar
Дата 4.6.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0879 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.