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

Вниз

Что значит такое объявление параметров?   Найти похожие ветки 

 
Fay   (2003-07-21 09:24) [0]

procedure AnyProc(var Buffer; Count : Integer);
begin
...


 
Calm ©   (2003-07-21 09:33) [1]

Buffer - нетипизованный параметр. Можешь обращаться к нему как хочешь. По сути это указатель.

Count - количество байт в Buffer, чтобы знать, сколько нужно обрабатывать.


 
Fay   (2003-07-21 09:39) [2]

Что такое Count я догадался 8).
Мне не ясно, как в НекийStream.Read(var Buffer; ...) совать
какой-нибудь PChar в качестве буфера? AV вылазит - а мне обидно.
8(


 
Альф ©   (2003-07-21 10:03) [3]

Пример давай...


 
Digitman ©   (2003-07-21 10:09) [4]


> Мне не ясно, как .. совать



var
какой_нибудь_который_нужно_совать: PChar;
...
НекийStream.Read(какой_нибудь_который_нужно_совать ^, count); //лезет ! со свистом)


 
Fay   (2003-07-21 10:19) [5]

2Digitman
Спасибо. Буду посмотреть. Если не сложно, объясни - почему ^ ?


 
Calm ©   (2003-07-21 10:29) [6]


> Если не сложно, объясни - почему ^ ?

ну PChar - это тоже указать на область памяти, которая считается строкой и заканчивается символом 0.

Если не сделать ^, то передашь просто адрес. А если ^, то данные, расположенные по этому адресу


 
Ihor Osov'yak ©   (2003-07-21 10:34) [7]

2 Fay (21.07.03 10:19)

Если какой_нибудь_который_нужно_совать декларирован как

procedure AnyProc(var какой_нибудь_который_нужно_совать; Count : Integer);

то моя имха говорит, что Digitman © (21.07.03 10:09) относительно ^ погорячился.. В этом случае ненужно этой крышечки там..


 
Calm ©   (2003-07-21 10:36) [8]


> то моя имха говорит, что Digitman © (21.07.03 10:09) относительно
> ^ погорячился.. В этом случае ненужно этой крышечки там..
>


О... пост Calm © (21.07.03 10:29) считать данным в состоянии афекта. Или по крайней мере в состоянии сильной занятости и ослабленного внимания :)


 
Digitman ©   (2003-07-21 10:37) [9]


> Fay


^ - Паскаль-оператор разыменования переменной.

В данном случае (т.е. в случае , когда форм.параметр декларирован как var Buffer):

- Указав ^ ты указываешь компилятору, что в качестве фактического параметра ты хочешь передать значение такой-то переменной, хранящей адрес буфера (указатель на буфер)

- Не указав ^ ты даешь право компилятору самому вычислить адрес буфера; видя, что в кач-ве оного тобой подставлено имя некоей переменной, компилятор расчитает ее (этой переменной) адрес в памяти и интерпретирует этот адрес как адрес желаемого тобой буфера; а буфером же на самом деле в этом случае является не область памяти, отведенная компилятором под саму переменную, а область памяти, нач.адрес которой хранится (будучи записанный туда тем или иным образом в тот или иной момент времени) в этой переменной; это - т.н. косвенная ссылка, превращение косвенной ссылки в прямую ссылку и есть суть операции разыменования.

Если


 
Ihor Osov'yak ©   (2003-07-21 10:39) [10]

2 Calm © (21.07.03 10:29)

Во первых, спич не о PChar.
Во вторых, применять ^ к нетипизированому параметру ( нетипизированный параметр есть по существу и нетипизипрованным указателем)..


 
Digitman ©   (2003-07-21 10:43) [11]


> Ihor Osov"yak


ну почему же "погорячился" ?)

без разыменования буфером будет считаться блок памяти под переменную, в то время как на самом деле буфером является не она сама, а область памяти, адрес которой эта переменная хранит


 
Fay   (2003-07-21 10:43) [12]

Работать - работает (ещё раз спасибо). Сам не догадался.
Что за тип такой в LPVOID?


 
Ihor Osov'yak ©   (2003-07-21 10:46) [13]

2 Calm © (21.07.03 10:36)

Сорри, когда я давал свой пред. пост, твоего еще не видел..

2 Digitman © (21.07.03 10:37)

Эта..

>Указав ^ ты указываешь компилятору, что в качестве фактического параметра ты хочешь передать значение такой-то переменной, хранящей адрес буфера (указатель на буфер


Указав ^ ты указываешь компилятору, что хочешь работать с переменной, на которую указывает типизированный указатель.. Так будет коректнее, и более понятно..

Зы. А в случае с Стрим.Рид, он также юзает нетипизированный параметр, так что крышечки все-же не надо - см. Ihor Osov"yak © (21.07.03 10:34)




 
Ihor Osov'yak ©   (2003-07-21 10:52) [14]


2 Digitman © (21.07.03 10:43)

См. Ihor Osov"yak © (21.07.03 10:46)

См. TStream,
function Read(var Buffer; Count: Longint): Longint; virtual; abstract;

Делаем попытку компиляции

procedure AnyProc(var Buffer; Count : Integer);
var s:TStream;
i:integer;
begin
s := TMemoryStream.Create;
s.Read(Buffer,count);
end;

procedure AnyProc2(var Buffer; Count : Integer);
var s:TStream;
i:integer;
begin
s := TMemoryStream.Create;
s.Read(Buffer^,count);
end;


Делаем выводы..

Зы я имею ввиду выводы не о чтении с пустого потока


 
Digitman ©   (2003-07-21 10:53) [15]


> Ihor Osov"yak


> Указав ^ ты указываешь компилятору, что хочешь работать
> с переменной, на которую указывает типизированный указатель..


Совершенно необязательно.

Будет корректна и такая конструкция :

var

buf: Pointer; // совершенно абстрактный указатель !
Stream.Read(buf^, ...)


 
Ihor Osov'yak ©   (2003-07-21 10:58) [16]



> Указав ^ ты указываешь компилятору, что хочешь работать
> с переменной, на которую указывает типизированный указатель..

Указав ^ ты указываешь компилятору, что хочешь работать
с переменной, на которую указывает типизированный указатель или с областью памяти, на которую указывает нетипизированный указатель...

Так будет действительно корректно..


> Будет корректна и такая конструкция :

var

buf: Pointer; // совершенно абстрактный указатель !
Stream.Read(buf^, ...)



А против этого никто и не возражает. Замечание относилось на предмет ненужности крышечи в вонструкции s.Read(Buffer,count) где Buffer есть нетипизироованным параметром-переменной..



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

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

Наверх




Память: 0.51 MB
Время: 0.017 c
14-10412
alexshell
2003-07-17 13:08
2003.08.04
Где взять доку и примеры по разработке сервисов NT?


7-10480
fil
2003-05-25 11:58
2003.08.04
Автозагрузка программы как сервис в win NT 2000 XP


1-10176
AndreyAs
2003-07-17 15:51
2003.08.04
Rave Reports по-русски


14-10398
Мыш
2003-07-17 11:18
2003.08.04
Несколько вопросов о хостинге


3-10103
anatolyk
2003-07-11 22:47
2003.08.04
Автоинкр. поля в MSSQL