Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];
ВнизPointer Найти похожие ветки
← →
qdelphi (2006-09-28 22:09) [0]Зачем вообще используют поинтеры?
т.е. ведь так не делают.var
i: Pinteger;
begin
New(i);
i := 255;
а делают просто Integer?
← →
TUser © (2006-09-28 22:16) [1]Так не делают. А по сабжу - изучи, например, класс TList и придумай ему применение. Почитай про Абстрактные Типы Данных и способы их реализации.
← →
Ketmar © (2006-09-28 22:22) [2]хм. помню, таким же вопросом когда-то задавался...
← →
DrPass © (2006-09-28 22:30) [3]Пример - из плохого учебника, и сути не отображает. Смысл нетипизированного указателя в том, что в реальной жизни приходится сталкиваться с самыми разными данными, тип которых программисту неизвестен... или не выражается стандартными типами integer, double и т.д.. Вот тут-то и приходит на помощь нетипизированный указатель. Например, нужно тебе в память сохранить изображение или звук. Куда его помещать? Берешь pointer, выделяешь под него память. И сохраняешь в нее по этому указателю.
← →
Fay © (2006-09-28 23:37) [4]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;
← →
Dmitrij_K (2006-09-28 23:39) [5]
> 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:40) [6]2 Dmitrij_K (28.09.06 23:39) [5]
Там и не такое встречается 8)
← →
DrPass © (2006-09-29 01:06) [7]
> Fay © (28.09.06 23:37) [4]
На аффтаров такого кода необходимо уголовные дела заводить... и вазектомию им делать, дабы не размножались :)
← →
Fay © (2006-09-29 01:16) [8]2 DrPass © (29.09.06 1:06) [7]
> На аффтаров такого кода необходимо ...
Да не. Афтар примера из [4] - хороший дядька, просто Delphi ему не родная.
Пощады, plz! 8))
← →
Loginov Dmitry © (2006-09-29 07:47) [9][4] - это еще не самый плохой код. У меня на работе примерно то же, но нигде не встречается FreeMem().
← →
Dmitrij_K (2006-09-29 08:50) [10]
> У меня на работе примерно то же
Подари хорошую книжку по Delphi
← →
evvcom © (2006-09-29 09:06) [11]> [8] Fay © (29.09.06 01:16)
> хороший дядька, просто Delphi ему не родная
Можно подумать, что на С такое приветствуется? Дядька может и хороший, а программист никудышный.
← →
qdelphi (2006-09-29 11:06) [12]Ну вроде понятно, что для нетипизированных данных используют поинтер. Ну а зачам тогда для типизированных использовать? Ещё я заметил, что при передачи в процедуры, функции обычно передают указатель на переменую а не саму переменную, это тоже рассматривать как правило?
← →
Плохиш © (2006-09-29 11:10) [13]
> qdelphi (29.09.06 11:06) [12]
Для бреда тут вообще-то отдельная конференция есть - "Прочее"
← →
evvcom © (2006-09-29 14:21) [14]> [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-битного значения, то обычно обходятся без ссылок/указателей путем написания обычной функции.
← →
Fay © (2006-09-29 14:44) [15]2 evvcom © (29.09.06 14:21) [14]
> В паскале для Value мы обязаны подставить фактическую переменнуюaaa(PInteger(nil)^);
← →
evvcom © (2006-09-29 14:59) [16]> [15] Fay © (29.09.06 14:44)
Я это знаю, но новичкам такое лучше не говорить. Рано им еще хакерствовать (компилятор обманывать).
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.044 c