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

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

Указатели [D7, XP]


Страницы:   1 2

allucard ©   (2007-04-24 09:11:00) 

Доброго дня.
Ув. мастера, прочитал тему по указателям, появилось пару вопросов, помогите разобраться:

1. Адрес чего я получаю в строке 1.
2. Адрес чего я получаю в строке 2.
3. Что я получаю в строке 7?
4. Почему компилятор пропускает строку IntToHex(Integer(P1^),8), а IntToHex(Integer(Button1^),8)не пропускает?


ListBox1.Items.Add (IntToHex(Integer(Button1),8)); //строка 1
ListBox1.Items.Add (IntToHex(Integer(@Button1),8)); // строка 2
ListBox1.Items.Add (IntToHex(Integer((@Button1)^),8)); //строка 3

P1 := Button1;//строка 4

ListBox1.Items.Add (IntToHex(Integer(P1),8); //строка 5
ListBox1.Items.Add (IntToHex(Integer(@P1),8); //строка 6
ListBox1.Items.Add (IntToHex(Integer(P1^),8); //строка 7

Спасибо.


Сергей М.   (2007-04-24 14:54:00) [1]


> можно же обмануть


Кто, кого и почему собрался "обманывать" - вот в чем вопрос)


allucard   (2007-04-24 14:48:00) [2]


> clickmaker ©   (24.04.07 10:45) [19]

ну, можно же обмануть :)


Mikola Paganini   (2007-04-24 11:02:00) [3]

2 homm:

>Ты бы кстати строки то пронумеровал бы, а то строка 6 похожа на перевод строки :)

Ty slepoj???


clickmaker   (2007-04-24 10:45:00) [4]


> [18] allucard   (24.04.07 10:41)

ну начнем с того, что компилятор твой пример не пропустит...
и какой глубокий смысл-то в этом?


allucard   (2007-04-24 10:41:00) [5]


> clickmaker ©   (24.04.07 10:38) [17]

ну в моём примере allucard   (24.04.07 10:34) [15]
что введёшь в переменную a, введётся в переменную b?

я прав?


> Сергей М. ©   (24.04.07 10:37) [16]

)))


clickmaker   (2007-04-24 10:38:00) [6]


> подменить адреса переменных

это ты к чему?


Сергей М.   (2007-04-24 10:37:00) [7]


> можно ведь и подменить адреса переменных


С дуру можно и ... сломать)


allucard   (2007-04-24 10:34:00) [8]


> clickmaker ©   (24.04.07 10:30) [14]

Как всё просто :о)

А можно ведь и подменить адреса переменных:)

a := 1;
b := 2;
c := @b;
@b := @a;
@a := c;


clickmaker   (2007-04-24 10:30:00) [9]


> есть адрес какой-то кнопки - задача: "нажать".

TButton(Address).Click;

TEdit(Address).Text :=


allucard   (2007-04-24 10:25:00) [10]


> Сергей М. ©   (24.04.07 10:11) [11]

Спасиб, если продолжать в таком духе, можно понять как работает компилятор :)


Что значит "работать" ?
Сформулируй конкретную задачу...


Например есть адрес какой-то кнопки - задача: "нажать".
Или есть адрес TEdit'a - ввести в его поле Caption текст.


clickmaker   (2007-04-24 10:16:00) [11]


> А как с полями обьекта работать, имея только его адрес

если известны размеры полей, то по смещению
+ надо учесть выравнивание, если структура не packed


Сергей М.   (2007-04-24 10:11:00) [12]


> Я получаю указатели на указатели?


Да.


> Прикольно что P1 хранятся в стековых адресах


Что ж в том "прикольного" ?


> указатель на Button1 и сам Button1 хранятся рядом 008D363C
> и 008D2128 что это за адреса?


Судя по значениям, это области памяти, распределенной динамически.


> обычные адреса хранятся в дампе 004263E8 например


А это уже область памяти, распределенная статически.


> А как с полями обьекта работать, имея только его адрес


Что значит "работать" ?
Сформулируй конкретную задачу...


allucard   (2007-04-24 10:07:00) [13]


> Сергей М. ©   (24.04.07 09:41) [6]

P1, P2 тип Pointer;
Button1 обычная кнопка.
Сделав например так:

P1 := @Button1;
P2 := @P1;
Button := @P2;

Я получаю указатели на указатели?
Прикольно что P1 хранятся в стековых адресах 0012F624.
А указатель на Button1 и сам Button1 хранятся рядом 008D363C и 008D2128 что это за адреса?
Ведь обычные адреса хранятся в дампе 004263E8 например.

А как с полями обьекта работать, имея только его адрес,
и чтоб компилятор пропустил?)


palva   (2007-04-24 09:54:00) [14]

1. Адрес области, где хранятся данные объекта Button1
2. Адрес объекта Button1
3. То, на что указывает указатель P1, приведенное к типу Integer
4. Потому что P1 является указателем, а Button1 не является.


Сергей М.   (2007-04-24 09:46:00) [15]

Если Button1 - переменная (или поле объекта), имеющая классовый тип, то

PInteger(Button)^


homm   (2007-04-24 09:43:00) [16]

> 3. Почему компилятор пропускает строку (P1^), а Integer(Button1^)
> не пропускает?

Видимо потому что P1^ — указатель на данные, не имеющие типа, их можно интерпретировать как угодно, а Button1^ — указатель на экземпляр класса, иеющий свой размер, и не приводимый к 4-м байтам. вот так приводит: Integer(pointer(Button1)^) ?


Сергей М.   (2007-04-24 09:41:00) [17]


> 1. Адрес чего я получаю @Button1 или @P1?


Адрес переменной (или поля объекта).


> 2. Что я получаю после:
> 3. Почему


Тип Button1 ?


allucard   (2007-04-24 09:36:00) [18]

Упростим вопросы:

1. Адрес чего я получаю @Button1 или @P1?

2. Что я получаю после:
P1 := Button1;
Integer(P1^)?

3. Почему компилятор пропускает строку (P1^), а Integer(Button1^) не пропускает?

P1:типа Pointer;

Спасибо.


Сергей М.   (2007-04-24 09:34:00) [19]


> allucard


Типы идентификаторов Button1 и P1 ?

Это же крайне важно)


homm   (2007-04-24 09:21:00) [20]

Ты бы кстати строки то пронумеровал бы, а то строка 6 похожа на перевод строки :)


Страницы:   1 2

Наверх

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