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

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

Работа с массивом через указатели [D7, XP]


Страницы:   1 2

allucard ©   (2007-11-09 11:40:00) 

Вопрос:

Есть процедура:

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
 Str: array [0..63] of byte;

begin
I := ComPort1.Read(str, Count);
read_trans(str, count);
end;


procedure read_trans(mem: pointer; count: integer);
begin
//Мне этой процедуре необходимо работать с массивом str
end;


1. Как передать процедуре указатель?
2. Как типизировать по указателю массив?

Спасибо.


Reindeer Moss Eater   (2007-11-09 13:12:00) [1]

procedure read_trans(const mem: TMyArray; count: integer);

А вот это уже называется уродливыми подпорками


Думкин   (2007-11-09 13:11:00) [2]

> Slym ©   (09.11.07 13:08) [27]

Я не про передачу параметров писал, а про совместимость типов. Новички часто нарываются на то, что не могут массив передать в процедуру.


Slym   (2007-11-09 13:08:00) [3]

Думкин ©   (09.11.07 12:27) [7]
Надо кидать переменную с явно указанным типом.

procedure read_trans(mem: TMyArray; count: integer);

procedure read_trans( constmem: TMyArray; count: integer);
только ссылкой без копий


Slym   (2007-11-09 13:06:00) [4]

Slym ©   (09.11.07 12:58) [21]
если параметр не const и не var то просто ссылкой...

т.е. если параметр const или var то просто ссылкой...


Anatoly Podgoretsky   (2007-11-09 13:06:00) [5]

Компилятор он же дурак, он же не знает, что бывают особые программисты.


Anatoly Podgoretsky   (2007-11-09 13:05:00) [6]

Не важно, что передается, но работать будет все равно с копией, для случая приведеного автором. А вот где будет создаваться копия, да вероятнее всего на стеке.


Reindeer Moss Eater   (2007-11-09 13:02:00) [7]

Или я перепутал ситуацию с рекордом ?

PMyRecord = ^TMyRecord
TMyRecord  = record
...
end;

рекокд точно полетит весь целиком


Джо   (2007-11-09 13:00:00) [8]

> [20] Reindeer Moss Eater ©   (09.11.07 12:57)
> Никуда никакая копия передаваться не  будет :)
>
> Точна?
> :)
> У нас же банальный массив [x..y] of something.

Если var — передастся ссылка (в регистре или через стек).
Если не var —— передестся ссылка и внутри процедуры будет сделана копия, с ней и будет работать.

Вроде так :)


Slym   (2007-11-09 12:58:00) [9]

Reindeer Moss Eater ©   (09.11.07 12:49) [15]
не всегда
если параметр не const и не var то просто ссылкой...
если без префиксов - будет делать копию


Reindeer Moss Eater   (2007-11-09 12:57:00) [10]

Никуда никакая копия передаваться не  будет :)

Точна?
:)
У нас же банальный массив [x..y] of something.


Reindeer Moss Eater   (2007-11-09 12:56:00) [11]

Причем в регистрах


Джо   (2007-11-09 12:55:00) [12]

> [15] Reindeer Moss Eater ©   (09.11.07 12:49)
> да нет большой разницы. Все равно будет передаваться копия
> всего массива туда и обратно.

Никуда никакая копия передаваться не  будет :)


Reindeer Moss Eater   (2007-11-09 12:55:00) [13]

Конечно. Передаются 4 байта PCharArray


allucard   (2007-11-09 12:53:00) [14]


> Reindeer Moss Eater ©   (09.11.07 12:33) [9]


быстрее для системы через указатели я так понял

через стек передаётся только указатель?


Reindeer Moss Eater   (2007-11-09 12:49:00) [15]

В стек поместится только адрес массива. Да и то, если только соглашение вызова не register, а иначе вообще в EAX ляжет.

да нет большой разницы. Все равно будет передаваться копия всего массива туда и обратно.


Джо   (2007-11-09 12:44:00) [16]

> [12] allucard   (09.11.07 12:37)
> PCharArray = ^TCharArray;
> TCharArray = array[0..32767] of Char;
> ?

Ага.


Джо   (2007-11-09 12:42:00) [17]

> [9] Reindeer Moss Eater ©   (09.11.07 12:33)
> Это если нравится гонять через стек большие объемы данных
> параметров

В стек поместится только адрес массива. Да и то, если только соглашение вызова не register, а иначе вообще в EAX ляжет.


allucard   (2007-11-09 12:37:00) [18]

PCharArray = ^TCharArray;
 TCharArray = array[0..32767] of Char;
?


Думкин   (2007-11-09 12:36:00) [19]

> allucard   (09.11.07 12:35) [10]

а самому описать?


allucard   (2007-11-09 12:35:00) [20]

а есть что-то по типу PByteArray только массив char?


Страницы:   1 2

Наверх

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