Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

var-Параметры_процедур - указатели. То ли лыжи не едут, .... [D7, XP]


Страницы:   1 2

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); - и не требуется приведение.
>

А почему бы так и не оставить? На кой ляд тебе создавать самому себе сложности и потом их героически преодолевать?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо