Поля - процедурные переменные

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Поля - процедурные переменные

Сообщение Ferrum » 10.11.2009 13:13:19

Всем здрасте =)
Вобщем ситуация такова:
Есть тип
Код: Выделить всё
type
  TLalala = object
    lalaProc: procedure;
  end;


Есть экземпляр типа
Код: Выделить всё
var
  Lalala: TLalala;


Есть процедура
Код: Выделить всё
procedure MylalaProc;


При старте проги делаю
Код: Выделить всё
Lalala.lalaProc := @MylalaProc;


И в каком то месте кода обязательно происходит
Код: Выделить всё
if Assigned(Lalala.lalaProc) then Lalala.lalaProc;


Так вот при компиляции в Delphi процедура MylalaProc выполняется, а в FPC нет.
Assigned в FPC возвращает false, выходит присваивания вообще не происходит.
В FPC овместимость с Delphi стоит.
Объясните, пожалуйста, в чём проблема и как сделать чтоб всё работало в FPC.
Аватара пользователя
Ferrum
новенький
 
Сообщения: 14
Зарегистрирован: 27.08.2009 10:11:53

Re: Поля - процедурные переменные

Сообщение VirtUX » 10.11.2009 14:22:39

type
TLalala = object
lalaProc: procedure of object;
end;
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Поля - процедурные переменные

Сообщение Sergei I. Gorelkin » 10.11.2009 15:28:30

VirtUX
Уж "of object" тут совершенно ни при чем. У товарища не событие, а обычная процедурная переменная - вариант, имеющий полное право на существование.

Ferrum
Вот этот код в FPC 2.5.1 работает так, как нужно (печатает "works"). По-видимому, проблема где-то в другом месте.

Код: Выделить всё
program tla;
{$mode delphi}

type
  myobj = object
    x: procedure;
  end;

procedure y;
begin
  writeln('works');
end;

var
  obj: myobj;
 
begin
  obj.x := @y;
  if assigned(obj.x) then obj.x;
end.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Поля - процедурные переменные

Сообщение Ferrum » 10.11.2009 21:36:48

Спосибо, я нашел решение)
На самом деле ситуация была сложнее...
У объекта был конструктор
Код: Выделить всё
constructor TLalala.Init;

Который выполнялся сразу после присваивания процедурной переменной значения. Всё дело в нём.
Решение проблемы я нашел случайно...
Если убрать конструктор или поместить его перед присваиванием, всё работает нормально.
Вероятно это одна из особенностей FPC.
Аватара пользователя
Ferrum
новенький
 
Сообщения: 14
Зарегистрирован: 27.08.2009 10:11:53

Re: Поля - процедурные переменные

Сообщение Sergei I. Gorelkin » 10.11.2009 22:00:12

Да, есть такая фишка: конструктор в FPC обнуляет поля объекта, а в Дельфи - похоже что нет.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Поля - процедурные переменные

Сообщение Fantomas » 10.11.2009 23:07:27

Sergei I. Gorelkin писал(а):Да, есть такая фишка: конструктор в FPC обнуляет поля объекта, а в Дельфи - похоже что нет.


Конструктор Delphi как раз делает именно так - забивает поля нулями. В InitInstance, кажется. По крайней мере, так в D1-7.


Ferrum писал(а):Спосибо, я нашел решение)
На самом деле ситуация была сложнее...
У объекта был конструктор
Код: Выделить всё
constructor TLalala.Init;

Который выполнялся сразу после присваивания процедурной переменной значения. Всё дело в нём.
Решение проблемы я нашел случайно...
Если убрать конструктор или поместить его перед присваиванием, всё работает нормально.
Вероятно это одна из особенностей FPC.


Только непонятно, зачем присваивать что-либо полю объекта, если еще не вызван конструктор, то есть объект не создан. Наверное, сначала происходит присваивание понятно чего, но непонятно чему, а затем создается объект и поле принимает значение nil.
Fantomas
новенький
 
Сообщения: 14
Зарегистрирован: 09.04.2008 19:12:50

Re: Поля - процедурные переменные

Сообщение Sergei I. Gorelkin » 11.11.2009 00:08:58

Тут речь об объектах "старого стиля" (object, а не class). object можно объявлять статически, как запись, initInstance у него нет, а конструктор нужен только если есть виртуальные методы.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Поля - процедурные переменные

Сообщение Fantomas » 11.11.2009 11:14:34

Sergei I. Gorelkin писал(а):Тут речь об объектах "старого стиля" (object, а не class). object можно объявлять статически, как запись, initInstance у него нет, а конструктор нужен только если есть виртуальные методы.


Виноват, невнимательно прочитал. Действительно, Delphi обнуляет поля object только когда тот создается динамически.
Fantomas
новенький
 
Сообщения: 14
Зарегистрирован: 09.04.2008 19:12:50

Re: Поля - процедурные переменные

Сообщение Ferrum » 22.06.2010 13:25:13

А что рациональнее использовать, object или class?
Аватара пользователя
Ferrum
новенький
 
Сообщения: 14
Зарегистрирован: 27.08.2009 10:11:53

Re: Поля - процедурные переменные

Сообщение zub » 22.06.2010 13:34:59

тоже когдато долго ломал голову, в похожей ситуации - было несколько конструкторов, один из них вызывался при уже сконструированном объекте с заполненными полями. в делфи работало, в fpc нет))

>>А что рациональнее использовать, object или class?
смотря для чего. ИМХО изза возможности создания статически - object рациональнее для для всякой мелочи и для вложенных объектов
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Поля - процедурные переменные

Сообщение alexrayne » 23.06.2010 00:43:33

zub писал(а):>>А что рациональнее использовать, object или class?смотря для чего. ИМХО изза возможности создания статически - object рациональнее для для всякой мелочи и для вложенных объектов

+1
имхо, классы ввели в целях сделать программирование более безопасным, гдето я читал об этом, и идея эта прет из С++. основной бонус в том что исчезает семантически разница между указателем на экземпляр объекта и самим объектом, этим затрудняется копирование экземпляров объектов, вместо этого обычным присваиванием копируются указатели на объект.этим устраняются возможные проблемы с передачей экземпляра параметром - он не может быть ошибочно передан как копия в параметре процедуры. копирование класса должно делать ТОЛЬКО специальными его собственными методами. для тупых программеров остается меньше возможностей наделать трудно излавливаемых ошибок, а указатели перегружаемые операторы в С++ могут быть очень хитрыми и совсем неявными.

В принципе в паскале это было действительно удобнее до тех пор пока не появилась авто-разадресация указателей. это в известной мере стерло семантические различия между указателем на объект и его экземпляром и ставить задалбывающие и замусоревающие ^ стало ненужно. собсно с этого момента , имхо, класс и потерял главный свой бонус безопасности в паскале, а проблемы со статическим размещением экземпляра делают его проигрышным в сравнении с объектом ибо у программиста отобрана\затруднена свобода управления размещением экземпляра.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Поля - процедурные переменные

Сообщение Vadim » 23.06.2010 05:48:54

А ещё ходят слухи, что статические object работают быстрее, чем динамические class. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Поля - процедурные переменные

Сообщение zub » 23.06.2010 14:08:19

Vadim
А ещё ходят слухи, что статические object работают быстрее, чем динамические class.

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

alexrayne
у программиста отобрана\затруднена свобода управления размещением экземпляра.

эта свобода - палка о 2х концах. хотя свобода должна быть))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Поля - процедурные переменные

Сообщение MageSlayer » 23.06.2010 20:11:20

alexrayne писал(а):
zub писал(а):>>А что рациональнее использовать, object или class?смотря для чего. ИМХО изза возможности создания статически - object рациональнее для для всякой мелочи и для вложенных объектов

собсно с этого момента , имхо, класс и потерял главный свой бонус безопасности в паскале, а проблемы со статическим размещением экземпляра делают его проигрышным в сравнении с объектом ибо у программиста отобрана\затруднена свобода управления размещением экземпляра.

Собственно, непонятно кто такой нехороший чего у бедного программиста отобрал и ему затруднил :).
Есть же штатная возможность выделять память под классы откуда хочешь - переопредели TObject.NewInstance - и порядок. И выделяй - хочешь из стандартной кучи, хочешь из своей собственной :))), или стека :)
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Поля - процедурные переменные

Сообщение zub » 23.06.2010 20:59:38

>>Есть же штатная возможность выделять память под классы откуда хочешь - переопредели TObject.NewInstance
Ключевое слово "выделяй" - память всеравно придется выделять, а var myClass:TmyClass всеравно будет ссылкой. в случае с object - всё по чесному - как объявили так и будет.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

Рейтинг@Mail.ru
cron