Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-10224
LedWorm
2003-07-20 21:42
2003.08.04
Как узнать кол-во файлов в папке ?


3-10083
AkaSaint
2003-07-11 01:09
2003.08.04
Глюк в методе ADOTable.Requery или у меня?


1-10290
Zn
2003-07-22 11:03
2003.08.04
Сохранение пропорций размеров компонентов.


1-10291
Alex300
2003-07-22 09:33
2003.08.04
Проблема с курсором


14-10364
shark
2003-07-18 21:48
2003.08.04
Delphi глючит





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский