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

Вниз

Работа с массивом через указатели   Найти похожие ветки 

 
allucard   (2007-11-09 11:40) [0]

Вопрос:

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

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 11:44) [1]

1. Как передать процедуре указатель?

Вот так и передать как указатель.
Только зачем?


 
Reindeer Moss Eater ©   (2007-11-09 11:45) [2]

Точннее зачем тебе в первой процедуре массив фиксированной длины, если у тебя там есть длина данных?
GetMem, Read и передвай дальше свой пойнтер куда хочешь


 
Dib@zol ©   (2007-11-09 11:46) [3]

1. Что такое I?
2. Почему бы не передавать сам массив?

Ну раз уж тебе так нужно пойнтерами, то на:

type
 TMyArr = array [0..63] of byte;
 PMyArr = ^TMyArr;
...
var
 str : TMyArr;
...
I := ComPort1.Read(str, Count);
read_trans(@str, count);

procedure read_trans(arr:PMyArr; count: integer);
begin
 arr^[1]:=246;
 arr^[3]:=arr^[2];
 ...
end;


 
Джо ©   (2007-11-09 11:48) [4]

type
 TMyArray = array [0..X] of Char;

var
 Str: TMyArr;
...
I := ComPort1.Read(@str[0], X);

procedure read_trans(mem: pointer; count: integer);
var
 A: TMyArray;
begin
 A := TMyArray(Mem^);    
end;


 
Джо ©   (2007-11-09 11:49) [5]

> I := ComPort1.Read(@str[0], X);

X-1  :D


 
allucard   (2007-11-09 12:22) [6]

Да можно и не поинтерами, у меня просто массив в процедуру не кидался


 
Думкин ©   (2007-11-09 12:27) [7]

> allucard   (09.11.07 12:22) [6]

Надо кидать переменную с явно указанным типом.

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


 
allucard   (2007-11-09 12:31) [8]

понял


 
Reindeer Moss Eater ©   (2007-11-09 12:33) [9]

Это если нравится гонять через стек большие объемы данных параметров


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

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


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

> allucard   (09.11.07 12:35) [10]

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


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

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


 
Джо ©   (2007-11-09 12:42) [13]

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

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


 
Джо ©   (2007-11-09 12:44) [14]

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

Ага.


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

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

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


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


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


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

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


 
Reindeer Moss Eater ©   (2007-11-09 12:55) [17]

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


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

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

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


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

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


 
Reindeer Moss Eater ©   (2007-11-09 12:57) [20]

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

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


 
Slym ©   (2007-11-09 12:58) [21]

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


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

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

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

Вроде так :)


 
Reindeer Moss Eater ©   (2007-11-09 13:02) [23]

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

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

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


 
Anatoly Podgoretsky ©   (2007-11-09 13:05) [24]

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


 
Anatoly Podgoretsky ©   (2007-11-09 13:06) [25]

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


 
Slym ©   (2007-11-09 13:06) [26]

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

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


 
Slym ©   (2007-11-09 13:08) [27]

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

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

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


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

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

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


 
Reindeer Moss Eater ©   (2007-11-09 13:12) [29]

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.12.02;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.029 c
2-1194438063
fart
2007-11-07 15:21
2007.12.02
Вопрос по Edit


2-1194352765
dumka
2007-11-06 15:39
2007.12.02
Подпись


2-1194334863
Kolan
2007-11-06 10:41
2007.12.02
Как правильно делать диалоги?


11-1178978783
_vadim
2007-05-12 18:06
2007.12.02
KOLDirDlgEx


8-1169895913
IMHO
2007-01-27 14:05
2007.12.02
Remove red eyes