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

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

Непонимаю в чем разница (указатель на запись) [D7, XP]


gosha73 ©   (2006-12-18 19:31:00) 

Есть у меня функция, которая возвращает указатель на структуру, вот она:
TMoreInfo = record
 InfoType: Word;
 Handler: LongWord;
end;
PMoreInfo = ^TMoreInfo;
....

MoreInfo: TMoreInfo;
...
function GetMoreInfo: PMoreInfo;
begin
 Result := @MoreInfo;
end;


Все работает конечно же, но как правильней обращатся к членам записи MoreInfo, вот в чем вопрос. У меня работает двумя способами и это меня настараживает. Вот как я это делаю:

if GetMoreInfo.InfoType = MY_INFO_TYPE then ....
if GetMoreInfo^.InfoType = MY_INFO_TYPE then ....


В чем подвох и почему работает при разных способах написания кода и как в данном случае правильно будет обращаться к записям структуры?


MetalFan   (2006-12-19 00:28:00) [1]

[12] у Дж.Рихтера например http://www.natahaus.ru/2005/10/01/windows_dlya_professionalov_.html


MsGuns   (2006-12-18 23:25:00) [2]

Очень трудно ощутить вкус авокадо по картинке в книжке.
Читать о принципах адресации, выделении и освобождении памяти операционной системой, а заодно об управлении созданием и уничтожением объектов в Windows


Loginov Dmitry   (2006-12-18 23:13:00) [3]

> даже писать хорошие программы можно незная досканально тему
> указателей


Пиши, только никому про это не говори.


gosha73   (2006-12-18 21:59:00) [4]

Спасибо, но читал Пачеко Ксавьера.
Там прямо заметка есть, что для начинающих понять будет совсем не просто и даже писать хорошие программы можно незная досканально тему указателей. Так что :(


Джо   (2006-12-18 21:47:00) [5]

> чтобы закрыть вопросы
> навсегда?

Чтобы «закрыть эти вопросы навсегда», лучше всего ознакомиться с ними в хорошей книге.


gosha73   (2006-12-18 21:44:00) [6]

Спасибо.
А может еще кто ответит на [5] и [6] чтобы закрыть вопросы навсегда?


Desdechado   (2006-12-18 21:00:00) [7]

@Proc - в данному случае как написал Джо это взятие адреса. Так адреса или указателя? или это одно и тоже? Насколько я понимаю адрес и указатель это 4 байта на начало того места где начиаются эти данные (наверно я тут неправ).
Указатель - это переменная, место хранения адреса. Взятие адреса дает возможность поместить этот адрес в указатель. Адрес - это значение.

Pointer это некий тип данных состоящих из 4х байтов, которые в себе содержат адрес (или указатель?) на определенные данные.
Pointer - это тип данных для абстрактных указателей. Приведение типа Pointer(x) - это приказ интерпретировать содержимое X как указатель. Аналогично ведь Double(1) - приказ интерпретировать единицу ни как целое, а как дробное значение.


gosha73   (2006-12-18 20:35:00) [8]

немного философии если не возражаете.

> Ega23 ©

Вопрос разницы ссылки и указателя.
Хочу понять как это происходит в самой памяти. Наверно с этого и надо начинать мне.
1. Первые 4 байта записи TMoreInfo это "адрес" верно?
2. Тогда вопрос, для PMoreInfo выделяется ли какая-либо память из 4х байтов или же это те самые начальные 4байта самой записи TMoreInfo?
3. Если пункт 1 я понимаю правильно, то наверно ссылка, это как раз вообще отдельные 4 байта в памяти, которые хранят в себе первые 4 байта TMoreInfo, а не являются частью самой TMoreInfo.

Вообщем вы видите насколько глубока чаша с кашей :)


gosha73   (2006-12-18 20:12:00) [9]

Да, с указателями, адресами и ссылками у меня в голове каша уже, поскольку написание у них извращенное как мне кажется. Ссылка и указатель вроде бы одно и тоже, а может и нет, вот в этом и страх :)


> Ega23 ©   (18.12.06 19:48) [4]

Я так понимаю в данном случае m это сама запись, а p это указатель на эту запись. Вот боюсь я указателей :) Помогите побороть страх :). Путает меня всё это в разных случаях.
Вот к примеру привожу то, что я встречал:
1. TProc = procedure of object;
Proc = TProc;

@Proc - в данному случае как написал Джо это взятие адреса. Так адреса или указателя? или это одно и тоже? Насколько я понимаю адрес и указатель это 4 байта на начало того места где начиаются эти данные (наверно я тут неправ).

2. Pointer(...);
Приведение типа тоже по словам Джо. Т.е. Pointer это некий тип данных состоящих из 4х байтов, которые в себе содержат адрес (или указатель?) на определенные данные.

3. PSome = ^TSome; SomeFunc^.Other = ....;
Pointer(SomeThing)^
^some

Вот это самое сложное и в хелпе нигде не ищется :)
Т.е. хочу понять, что происходит когда этот символ присутствует перед и после переменных, и перед и после функций и процедур. Если вы мне это объясните, то наверно это будет полезно очень многим кодерам на дельфи, которых при виде символов ^,@ вызывает такое же выражение на лице как сами символы :)


Джо   (2006-12-18 19:48:00) [10]

> [2] gosha73   (18.12.06 19:43)
> А еще было бы здорово понять, почему @MoreInfo означает
> тоже самое, что PMoreInfo и компилятор при этом не ругается.
> Хотя ведь по идее PMoreInfo это указатель и правильней было
> бы написать Pointer(MoreInfo), но как раз в данном случае
> компилятор и ругается.

@ — операция взятия адреса.
Pointer() — приведение типа.


Ega23   (2006-12-18 19:48:00) [11]


> еще было бы здорово понять, почему @MoreInfo означает тоже
> самое, что PMoreInfo и компилятор при этом не ругается.
> Хотя ведь по идее PMoreInfo это указатель и правильней было
> бы написать Pointer(MoreInfo), но как раз в данном случае
> компилятор и ругается.


Так. Похоже, у тебя некая каша в голове.
Вот смотри:

type
TMoreInfo = record
InfoType: Word;
Handler: LongWord;
end;
PMoreInfo = ^TMoreInfo;

var
 m : TMoreInfo;
 p : PMoreInfo;


что в данном случае m и что p?


gosha73   (2006-12-18 19:43:00) [12]


> Ega23 ©

Большое спасибо.

А еще было бы здорово понять, почему @MoreInfo означает тоже самое, что PMoreInfo и компилятор при этом не ругается. Хотя ведь по идее PMoreInfo это указатель и правильней было бы написать Pointer(MoreInfo), но как раз в данном случае компилятор и ругается.
Заранее благодарен.


Ega23   (2006-12-18 19:39:00) [13]

Формально - GetMoreInfo^.InfoType
Но можно и GetMoreInfo.InfoType, ничего страшного в этом не будет.


Наверх

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