Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1159534445
worldmen
2006-09-29 16:54
2006.10.15
Экспорт в Excel.


10-1124054722
Lotus
2005-08-15 01:25
2006.10.15
The server threw an exception


3-1155109989
Romkin
2006-08-09 11:53
2006.10.15
Дерево. Определение принадлежности узлов.


15-1158740484
Layner
2006-09-20 12:21
2006.10.15
Должны ли банки после погашения кредита выдавать справки о его


15-1159278063
PHPDeveloper
2006-09-26 17:41
2006.10.15
Вопрос по HTML





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский