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