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

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

Pointer


qdelphi ©   (2006-09-28 22:09:00) 

Зачем вообще используют поинтеры?
т.е. ведь так не делают.
var
i: Pinteger;
begin
New(i);
i := 255;


а делают просто Integer?


evvcom   (2006-09-29 14:59:00) [1]

> [15] Fay ©   (29.09.06 14:44)

Я это знаю, но новичкам такое лучше не говорить. Рано им еще хакерствовать (компилятор обманывать).


Fay   (2006-09-29 14:44:00) [2]

2 evvcom ©   (29.09.06 14:21) [14]
> В паскале для Value мы обязаны подставить фактическую переменную
aaa(PInteger(nil)^);


evvcom   (2006-09-29 14:21:00) [3]

> [12] qdelphi   (29.09.06 11:06)
> что при передачи в процедуры, функции обычно передают указатель
> на переменую а не саму переменную, это тоже рассматривать
> как правило?

в паскале в конструкции procedure aaa(var Value: Integer);переменная передается по ссылке, т.е. в машинном коде в процедуру передается указатель. В Си аналогичная конструкция записывается как void aaa(int * value). В синтаксисе могу немного ошибаться, но это сейчас не важно. Здесь явно видим передачу указателя. В принципе конструкции почти идентичны, но есть одно но. В паскале для Value мы обязаныподставить фактическую переменную, в сишном варианте можем передать nil (или там кажется null). API-функции (написанные на С, AFAIR) проверяют на нульность этого параметра, и если не нуль (не пустой указатель), то прописывают результат. Delphi-компилятор не проверяет на нульность, так как не позволяет туда передавать константу (nil), потому как адреса она не имеет. Чтобы на Delphi получить полный аналог сишного варианта, пишут так
procedure aaa(pValue: PInteger);
тогда можно передавать и константу nil. Именно так выглядят декларации API-функций в Windows.pas.
Итого: указатель передают, чтобы функция/процедура могла по этому адресу записатьрезультат. Если достаточно одного 32-битного значения, то обычно обходятся без ссылок/указателей путем написания обычной функции.


Плохиш   (2006-09-29 11:10:00) [4]


> qdelphi   (29.09.06 11:06) [12]

Для бреда тут вообще-то отдельная конференция есть - "Прочее"


qdelphi   (2006-09-29 11:06:00) [5]

Ну вроде понятно, что для нетипизированных данных используют поинтер. Ну а зачам тогда для типизированных использовать? Ещё я заметил, что при передачи в процедуры, функции обычно передают указатель на переменую а не саму переменную, это тоже рассматривать как правило?


evvcom   (2006-09-29 09:06:00) [6]

> [8] Fay ©   (29.09.06 01:16)
> хороший дядька, просто Delphi ему не родная

Можно подумать, что на С такое приветствуется? Дядька может и хороший, а программист никудышный.


Dmitrij_K   (2006-09-29 08:50:00) [7]


> У меня на работе примерно то же

Подари хорошую книжку по Delphi


Loginov Dmitry   (2006-09-29 07:47:00) [8]

[4] - это еще не самый плохой код. У меня на работе примерно то же, но нигде не встречается FreeMem().


Fay   (2006-09-29 01:16:00) [9]

2 DrPass ©   (29.09.06 1:06) [7]
> На аффтаров такого кода необходимо ...
Да не. Афтар примера из [4] - хороший дядька, просто Delphi ему не родная.
Пощады, plz! 8))


DrPass   (2006-09-29 01:06:00) [10]


> Fay ©   (28.09.06 23:37) [4]

На аффтаров такого кода необходимо уголовные дела заводить... и вазектомию им делать, дабы не размножались :)


Fay   (2006-09-28 23:40:00) [11]

2 Dmitrij_K   (28.09.06 23:39) [5]
Там и не такое встречается 8)


Dmitrij_K   (2006-09-28 23:39:00) [12]


> var
>  RelTab : ^TADOQuery;
> ...
> begin
>  New(RelTab);
>  RelTab^ := TADOQuery.Create(self);
>  RelTab^.Connection := DBConnect;
>  RelTab^.LockType := ltReadOnly;
> ...
>  RelTab^.Active := False;
>  RelTab^.Free;
>  FreeMem(RelTab);
> end;


Изврат т.ж. как в [0]


Fay   (2006-09-28 23:37:00) [13]

2 TUser ©   (28.09.06 22:16) [1]
> Так не делают.
Делают, и даже не так!

Вот пример (это не я писал!) из реальной проги, на которую я сейчас ремейк леплю.

...
var
 RelTab : ^TADOQuery;
...
begin
 New(RelTab);
 RelTab^ := TADOQuery.Create(self);
 RelTab^.Connection := DBConnect;
 RelTab^.LockType := ltReadOnly;
...
 RelTab^.Active := False;
 RelTab^.Free;
 FreeMem(RelTab);
end;


DrPass   (2006-09-28 22:30:00) [14]

Пример - из плохого учебника, и сути не отображает. Смысл нетипизированного указателя в том, что в реальной жизни приходится сталкиваться с самыми разными данными, тип которых программисту неизвестен... или не выражается стандартными типами integer, double и т.д.. Вот тут-то и приходит на помощь нетипизированный указатель. Например, нужно тебе в память сохранить изображение или звук. Куда его помещать? Берешь pointer, выделяешь под него память. И сохраняешь в нее по этому указателю.


Ketmar   (2006-09-28 22:22:00) [15]

хм. помню, таким же вопросом когда-то задавался...


TUser   (2006-09-28 22:16:00) [16]

Так не делают. А по сабжу - изучи, например, класс TList и придумай ему применение. Почитай про Абстрактные Типы Данных и способы их реализации.


Наверх

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