Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.018 c
4-1156744440
APiC
2006-08-28 09:54
2007.01.07
Работа с курсорами


9-1141459817
NightLord
2006-03-04 11:10
2007.01.07
PlugInIntf из GLScene


15-1166102408
Vlad Oshin
2006-12-14 16:20
2007.01.07
SQL. where 1=2 Это зачем так писать?


2-1166175991
sidiakin
2006-12-15 12:46
2007.01.07
Помогите разобраться с машинным кодом!


15-1166411867
Slider007
2006-12-18 06:17
2007.01.07
С днем рождения ! 16 декабря





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский