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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> адрес Self и адрес объекта not= 
V
    Опции темы
takedo
Дата 1.11.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

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



Добрый день. Три дня маялся и понял в чем была заковыка: адрес Self не равен адрусу объекта!!!! smile 
Привожу примерный поясняющий код

Код

type A=class
public
function Addr():Pointer;
end;
function A.Addr():Pointer;
begin
Result:=@Self;
end;

В программе получится примерно так:
Код

B:Pointer;
objecticus: A;

objecticus:=A.Create;
B:=A.Addr;


Так вот получатеся, что B не равно @A!

Я хочу спросить, может смещение к @Self надо применять? И вообще в дельфи можно делать делегатов как в C++?
PS примеры утрированы и приведены ради объяснения проблемы.

Это сообщение отредактировал(а) takedo - 1.11.2008, 10:32


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
MetalFan
Дата 1.11.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Переменная-объект сама является неявным указателем на экземпляр класса(если он конечно создан)... а какой смысл получать ее адрес  smile 


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
takedo
Дата 1.11.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

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



Смысл такой:
Если есть объект "Е", содержащий массив фреймов и массив кнопок, а по нажатию кнопки нужно сменить фрейм. Мне в этот раз не захотелось делать через сообщения, поэтому пошёл по такому пути: в кнопке есть указатель на объект "Е", по которому вызываем функцию E^.ChfngeFrame. Вот собственно пример того, что это бывает нужно. Неспроста я спросил про делегатов в дельфи - это их задача, только в Си делегат это указатель на функцию если не ошибаюсь. В шарпе на этом основана обработка сообщений (я только начинаю изучать шарп, да и дельфи всего пару недель назад началsmile ). В Си же указатель this(аналог @Self) всегда равен адресу объекта, поэтому я и спрашиваю про Self и делегаты.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
MetalFan
Дата 1.11.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



нет никакого смысла брать @Self... Self и сам по сути является указателем.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
takedo
Дата 1.11.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

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



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

Добавлено через 3 минуты и 31 секунду
да и вообще вопрос не в том какой смысл, а в том что с этим делать. 


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
MetalFan
Дата 1.11.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(takedo @  1.11.2008,  12:51 Найти цитируемый пост)
попробуй возьми, или набери примерчик в первом посте и удивись.

зачем мне его набирать, если там написан бред?

Цитата(takedo @  1.11.2008,  10:31 Найти цитируемый пост)
Так вот получатеся, что B не равно @A!

а с чего оно должно быть равным??? адрес VMT класса и адрес объекта?

Добавлено @ 13:26
Цитата(takedo @  1.11.2008,  12:36 Найти цитируемый пост)
в кнопке есть указатель на объект "Е", по которому вызываем функцию E^.ChfngeFrame. Вот собственно пример того, что это бывает нужно.

так а что мешает написать както так:
Код

TSomeObjectList = class;
TSomeObject = class
private
...
  FList: TSomeObjectList;
...
public
  procedure CallListMethod;
  property List: TSomeObjectList read FList write FList;
end;

TSomeObjectList = class
...
public
  property Items[ AIndex: Integer ]: TSomeObject read GetItem write SetItem;
  procedure SomeMethod;
...
end;

implementation


...  
  procedure  TSomeObject.CallListMethod;
  begin
    FList.SomeMethod;
  end;
...

повторюсь: вообще неясно, зачем нужен "указатель на объект", если переменная-объект и так является указателем???

Это сообщение отредактировал(а) MetalFan - 1.11.2008, 13:29


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
takedo
Дата 1.11.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

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



ничего не мешает, однако массив TSomeObject в TSomeObjectList создается из метода TSomeObjectList и как ни крути там нужно будет работать с Self. Да, можно попробовать без @Self.

Добавлено через 11 минут и 8 секунд
Переделал так как ты посоветовал. Работает, но есть минус - не получается сделать каждый класс в одном файле - путанно. Ну и дальше, я чего не пойму: когда я храню адрес - трачу 4 байта, а когда я в каждом объекте TSomeObject храню по TSomeObjectList я типа тоже храню ссылку(указатель)? Конечно, получив ответ на последний вопрос, я наверное не буду париться по @Self smile 


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
MetalFan
Дата 1.11.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(takedo @  1.11.2008,  16:12 Найти цитируемый пост)
однако массив TSomeObject в TSomeObjectList создается из метода TSomeObjectList и как ни крути там нужно будет работать с Self.

при таком подходе - да. и что в этом плохого?

Цитата(takedo @  1.11.2008,  16:12 Найти цитируемый пост)
не получается сделать каждый класс в одном файле - путанно

под каждый класс отдельный юнит - непутанно??? ну-ну...

Цитата(takedo @  1.11.2008,  16:12 Найти цитируемый пост)
когда я храню адрес - трачу 4 байта, а когда я в каждом объекте TSomeObject храню по TSomeObjectList я типа тоже храню ссылку(указатель)?

я тебе про это уже не раз говорил в предыдущих постах.

еще вариант: если тебе нужен только один метод из класса-списка, то можешь хранить ссылку на него в объектах-элементах (но это уже будет по 8 байт)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
bems
Дата 1.11.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(takedo @  1.11.2008,  10:31 Найти цитируемый пост)
B:=A.Addr;
тут ты наверное имел в виду "A:=objecticus.Addr"
Если так, то
Код

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type A=class
       public
        function Addr():Pointer;
       end;

       function A.Addr():Pointer;
       begin
       Result:=Self//Result:=@Self;
       end;

var B:Pointer;
    objecticus: A;
begin
objecticus:=A.Create;
B:=objecticus.Addr;
Writeln(objecticus=b);
readln
end.

Это демонстрация "какой указатель равен какому", а не руководство к действию.

Цитата(takedo @  1.11.2008,  16:12 Найти цитируемый пост)
ничего не мешает, однако массив TSomeObject в TSomeObjectList создается из метода TSomeObjectList и как ни крути там нужно будет работать с Self. Да, можно попробовать без @Self.

Self это указатель на объект, а @Self адрес указателя. Ежу понятно что если один и тот же указатель кранить по десяти адресам, то они будут указывать на один объект, но адреса самих указателей будут не равны, поэтому в твоем примере и не вышло равенства. 

Но это так, технические подробности. А по сути: на то оно и объектно-ориентированое, чтобы писать на нем объектно-ориентировано.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
takedo
Дата 5.11.2008, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

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



Спасибо всем. Проблема возникла вот в результате чего: В Си есть переменная, указатель на переменную(адрес) и ссылка. В паскале есть только переменная и указатель, а ссылка есть неявно - она испошльзуется "умным" паскалем, а раз ее нет - я по простоте душевной прибегнул к указателю. Но сейчас я разобрался с вашей помощью более или менее.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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