Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.053 c
15-1194236411
Bess
2007-11-05 07:20
2007.12.02
ICO вместо BMP


4-1179822306
cosinus
2007-05-22 12:25
2007.12.02
Как найти одно из чужих окон по его потомку?


15-1193597283
artkil
2007-10-28 21:48
2007.12.02
Вопрос по созданию пиринговой сети


15-1193772970
korneley
2007-10-30 22:36
2007.12.02
Фича/глюк/(не)задокументированная возможность ?


15-1193307568
Валентин
2007-10-25 14:19
2007.12.02
смогу ли я быть программистом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский