![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с массивом через указатели [D7, XP]
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?