Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на запись, Разыменование указателя 
:(
    Опции темы
Lexicss
Дата 9.9.2006, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 1



Для простоты изъяснения вопроса приведу простейший пример:

Код

type
  PTRec = ^TRec;
  TRec = record
     Name : String;
     Age    : Integer;
  end;

var 
  pMyRec : PTRec;
...
...

begin
  New(pMyRec);
  pMyRec.Name := 'John';
  pMyRec.Age := 16;

  Caption := pMyRec.Name + IntToStr(pMyRec.Age);
  Dispose(pMyRec)
end;


В этом коде компилятор мне ошибку не выкидывает и програма тоже выдаёт ожидаемый результат.
Но ведь у меня указатель pMyRec не разыменован. Если я разыменовываю(pMyRec^.Name ...) - тоже всё нормально. Никаких ошибок. 

Так как всё же правильно писать? Можно и разыменовывать и не разыменовывать как вздумается? Или всё же опасно так писать?

--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
Romikgy
Дата 9.9.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Lexicss @  9.9.2006,  11:00 Найти цитируемый пост)
pMyRec^.Name

так правильно , 
а так
Цитата(Lexicss @  9.9.2006,  11:00 Найти цитируемый пост)
pMyRec.Name

имхо делает по аналогии с классами, 
PS подождем что гуру скажут smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 9.9.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Lexicss, Это упрощеный синтаксис, послабление для програмиста позволяющее не писать значек "^", удобно его так использовать, но не надо забывать, что это все же указатель, особенно при передаче его в качестве аргумента в функцию. Мне кажется, что такая более разборчива и естествена, но конечно такое использование может привести к учащению ошибок, потому как забываешь, как ты ее раньше объявил, как запись или как указатель на запись.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lexicss
Дата 9.9.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 1



Я вообще раньше даже внимание на такое не обращал. Всегда делал без разыменования. Но когда вчера более опытные программисты на Делфи у меня  в коде такое увидели, то очень удивились что как ещё тока компилятор такое пропускает.  И ещё вчера услышал, что если обращаться к указателю без разыменования, то есть вероятность получить неверный результат. Это правда?
--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
Демо
Дата 9.9.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Lexicss @  9.9.2006,  12:35 Найти цитируемый пост)
И ещё вчера услышал, что если обращаться к указателю без разыменования, то есть вероятность получить неверный результат. Это правда?


Это вряд ли.


Цитата(alexeis1 @  9.9.2006,  12:14 Найти цитируемый пост)
 Мне кажется, что такая более разборчива и естествена


Мое мнение - надо всегда явно проводить операцию разыменовывания.
Это позволит всегда видеть, что задумано в коде и позволит избавиться от многих ошибок и неясностей.


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 9.9.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Snowy @  23.8.2006,  00:25 Найти цитируемый пост)
Подобное поведение компилятора широко используется в библиотеке KOL. В которой все объекты - это указатели, но обращение к ним идёт, как к переменным - компилятор автоматом перетранслирует это в "правильный" код.
Пример:TPoint.X идентично PPoint.X, хотя правильно было бы написать PPoint^.X.Но компилятор распознаёт такое поведение и транслирует его, т.к. понимает, что обращение к полям указателя - нереально, и программист имел ввиду поле объекта/структуры, на которую указывает указатель.


PM MAIL   Вверх
Guedda
Дата 11.9.2006, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Цитата(Snowy @  9.9.2006,  14:59 Найти цитируемый пост)
т.к. понимает,

Умная машина smile

А вообще, при переносе на более ранние версии компиляторов (напр. Delphi 3), этот код будет выдавать ошибку.
Поэтому, моё мнение, всё надо делать по правилам, так как потом можно и забыть про такое.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Snowy
Дата 11.9.2006, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



3-я дельфя глотает такое нормально.
Фишка иногда полезная - позволяет скрыть подробности реализации (как в KOL).
Для новичка конечно лучше делать с явным разыменовыванием, чтоб не путаться.
Для тех, кто и так не путается, бывает весьма удобно использование без явного разыменовывания.
Я, например регулярно юзаю именно так.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.