Форум: "Начинающим";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];
ВнизРабота с массивом через указатели Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.046 c