![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 и придумай ему применение. Почитай про Абстрактные Типы Данных и способы их реализации.