![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
var-Параметры_процедур - указатели. То ли лыжи не едут, .... [D7, XP]
Cobalt © (2007-08-29 16:31:00)Подскажите, как указать, что процедуре можно передать любой указатель, а то если указать просто Pointer, то она требует обязательно привести к Pointer
procedure ReFillPointer(var p: pointer; len: Cardinal; b: Byte=0);
----
PSecurityDescriptor = ^TSecurityDescriptor;
var
Desc: PSecurityDescriptor;
----
так - ругается
ReFillPointer(@Desc,len,0);
Types of actual and formal var parameters must be identical
а так - нет:
ReFillPointer(Pointer(Desc),len,0);
Но чёт у меня сомнения насчёт второго варианта...
P.S.
А поставилprocedure ReFillPointer(var p: PSecurityDescriptor; len: Cardinal; b: Byte=0);- и не требуется приведение.
Как бы вообще обойтись без приведения?
ей даже {$T-} пофиг...
Чё-то нифига не пойму :(
Cobalt (2007-08-29 17:28:00) [21]Собственно вопрос в том, как убрать явноепреобразование к нетипизированному указателю (pointer) при вызове этой функции если ее объявить как
procedure ReFillPointer(var p: Pointer; len: Cardinal; b: Byte=0);
Cobalt (2007-08-29 17:25:00) [22]> Юрий Зотов © (29.08.07 17:01) [5]
> Передается не указатель, а его адрес. Вряд ли Вы хотели именно этого.
именно этого-то и хотел. Вот полностью код, который проясняет необходимость передачи указателя по ссылке.
procedure ReFillPointer(var p: PSecurityDescriptor; len: Cardinal; b: Byte=0);
begin
if p<>nil
then begin
FreeMem(p);
end;
GetMem(p, len);
FillChar(p^, len, b);
end;
Читаю справку, и не могу понять, чтоже я делаю не так:
If a routine's declaration specifies a var parameter, you must pass an assignable expression--that is, a variable, typed constant (in the {$J+} state), dereferenced pointer, field, or indexed variable
Юрий Зотов (2007-08-29 17:01:00) [23]> Cobalt © (29.08.07 16:31)
procedure ReFillPointer(var p: pointer; len: Cardinal; b: Byte=0);
type
PSecurityDescriptor = ^TSecurityDescriptor;
var
Desc: PSecurityDescriptor;
----
ReFillPointer(@Desc, len, 0);
Передается не указатель, а его адрес. Вряд ли Вы хотели именно этого. Кроме того, параметр объявлен с описателем var, поэтому передача результата операции@ вместо явной переменной здесь не прокатит.
А вот так все должно прокатывать:
ReFillPointer(Desc, len, 0);
поскольку в парамерах процедуры стоит просто pointer. То есть, ЛЮБОЙ указатель.
Сергей М. (2007-08-29 16:53:00) [24]
> как указать, что процедуре можно передать любой указатель
const Param
var Param
out Param
Выбирай на вкус.
DVM (2007-08-29 16:51:00) [25]
> хочется иметь универсальную процедуру,
Источник потенциальных ошибок. Строгая типизация она ведь больше пользы приносит.
Cobalt (2007-08-29 16:46:00) [26]> DVM © (29.08.07 16:34) [1]
хочется иметь универсальную процедуру, а не писать на каждый acl, sid и прочие закрытые указатели по процедуре, или же оборачивать их в pointer.
DVM (2007-08-29 16:34:00) [27]
> А поставил procedure ReFillPointer(var p: PSecurityDescriptor;
> len: Cardinal; b: Byte=0); - и не требуется приведение.
>
А почему бы так и не оставить? На кой ляд тебе создавать самому себе сложности и потом их героически преодолевать?