Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.07;
Скачать: CL | DM;

Вниз

Непонимаю в чем разница (указатель на запись)   Найти похожие ветки 

 
gosha73   (2006-12-18 19:31) [0]

Есть у меня функция, которая возвращает указатель на структуру, вот она:
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 ....


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


 
Ega23 ©   (2006-12-18 19:39) [1]

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


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


> Ega23 ©

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

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


 
Джо ©   (2006-12-18 19:48) [3]

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

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


 
Ega23 ©   (2006-12-18 19:48) [4]


> еще было бы здорово понять, почему @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 20:12) [5]

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


> 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

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


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

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

> Ega23 ©

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

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


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

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

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


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

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


 
Джо ©   (2006-12-18 21:47) [9]

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

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


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

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


 
Loginov Dmitry ©   (2006-12-18 23:13) [11]

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


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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.01.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
15-1166418362
sl8er
2006-12-18 08:06
2007.01.07
StrPos в Oracle


9-1140888718
Xandr
2006-02-25 20:31
2007.01.07
ещё раз о столкновении


2-1166159689
StormZCOoler
2006-12-15 08:14
2007.01.07
Считывание строки из файла


15-1166272732
Cyrax
2006-12-16 15:38
2007.01.07
Calling convension и name mangling в BCB и MSVC


15-1166390678
AntiUser
2006-12-18 00:24
2007.01.07
Системный администратор осужден на 8 лет