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

Вниз

object`ы в delphi 2009   Найти похожие ветки 

 
просто так   (2008-10-13 21:08) [0]

Ктонибудь компилировал в D2009 проги использующие object`ы?

В конструкторе при вызове objsetup почемуто портятся поля объекта и походу указатель на vmt. далее при вызове любого виртуального метода AV.

Это глюк или так и надо?


 
просто так   (2008-10-14 11:37) [1]

zcad.dpr

program ZCAD;
uses
ZBasicVisible;
var
  a:zbasic;
begin
 a.initxywh;
end.

ZBasicVisible.pas

unit ZBasicVisible;
interface
uses
 zguis;
type
   pzbasic=^zbasic;
   zbasic=object(zgui)
          end;
implementation
end.

zguis.pas

unit zguis;
interface
type
zgui=object
          test:pointer;
          procedure crash;virtual;
          constructor initxywh;
    end;
implementation
procedure zgui.crash;
begin
    test:=nil;
end;
constructor zgui.initxywh;
begin //вот тут при нажатии F7 поле test запартачивается
    crash; //тут AV
end;
initialization
end.


вот выдирка с ошибкой


 
sniknik ©   (2008-10-14 20:37) [2]

у меня конечно нет 2009го но
> begin
>  a.initxywh;
> end.

там изменили способ вызова конструктора? т.е. того самого метода что инициализирует виртуальные методы.
объект там теперь не нужно создавать типа  
a:= zbasic.initxywh; (имя конструктора create лучше бы смотрелось, имхо)
?
в общем либо так должно быть, либо  убрать слово virtual из описания процедуры в объекте.


 
просто так   (2008-10-14 22:00) [3]

>>a:= zbasic.initxywh; (имя конструктора create лучше бы смотрелось, имхо)
как ни назови, суть с ошибкой не изменится((
>>в общем либо так должно быть, либо  убрать слово virtual из описания процедуры в объекте.

так не должно быть. virtual в этом примере только чтоб показать ошибку, но в реальной проге он вообщета нужен.
если все определения скинуть в один файл, то всё работает((


 
sniknik ©   (2008-10-14 22:20) [4]

> как ни назови, суть с ошибкой не изменится((
суть не в имени, а в вызове.
разницу видишь?
> a.initxywh;
объект не создан, виртуальные методе не инициализированы
и
> a:= zbasic.initxywh;

c названием это просто было бы очевидным
вот что на твой взгляд правильно а что нет
var
 lst: TStringList;
begin
 lst.Create; //это
 lst:= TStringList.Create; //или это


и почему?


 
sniknik ©   (2008-10-14 22:29) [5]

> virtual в этом примере только чтоб показать ошибку, но в реальной проге он вообщета нужен.
раз нужен значит нужно что то менять, либо пользоваться только классовыми/статическими методами, и не держать данных в объектах, раз не хочешь их создавать. либо все таки подумать над вызовом.
(может то, что ты показал в 2009 и есть его создание, не к курсе, что там поменяли, но если бы это было правильным то и ошибки не было бы)


 
просто так   (2008-10-14 23:01) [6]

>> a:= zbasic.initxywh;
>>lst:= TStringList.Create; //или это
Пожалуйста не путайте object`ы и class`ы. в данном примере синтаксически всё верно. это глюк 2009, в других вериях всё ок


 
sniknik ©   (2008-10-15 01:14) [7]

> это глюк 2009, в других вериях всё ок
все пропало,  KOL "погиб", он то весь на объектах. а никто в конференции kol этого не знает, портируют его под 2009й, пишут, юникод внедряют, и даже не догадываются что он не работает... ;)


 
Германн ©   (2008-10-15 01:53) [8]


> sniknik ©   (15.10.08 01:14) [7]

Всё пропало! Гипс снимают! Клиент уезжает!
(с)


 
icWasya ©   (2008-10-15 11:02) [9]

у меня 12.0.3163.16897 - и не ломается


 
Плохиш ©   (2008-10-15 11:06) [10]


> просто так   (14.10.08 23:01) [6]
> Пожалуйста не путайте object`ы и class`ы.

ну-ка, ну-ка, расскажи-ка разницу между ними.


 
просто так   (2008-10-15 13:44) [11]

>>icWasya
не ломается [1] или чето другое?
12.0.3170.16989 ломается. до этого было еще 2 ранешних версии, тоже ломалось.

>>sniknik, Германн
Ирония конечно хорошо)). может потрудитесь объяснить что я неправильно делаю? [2] и предложения юзать классы не катит

>>Плохиш
За бочку варенья и пачку печенья - легко.


 
Сергей М. ©   (2008-10-15 14:11) [12]


> предложения юзать классы не катит
>


Стесняюсь спросить, на какую из больных мозолей они тебе наступили ?


 
просто так   (2008-10-15 14:53) [13]

ничем, сделано на object`ах, в 2009 перестало работать, заинтересовался почему


 
Anatoly Podgoretsky ©   (2008-10-15 16:07) [14]

> просто так  (15.10.2008 14:53:13)  [13]

Еще в Д7 или раньше было написано

Object types are supported for backward compatibility only. Their use is not recommended.


 
Сергей М. ©   (2008-10-15 16:14) [15]


> Anatoly Podgoretsky ©   (15.10.08 16:07) [14]


Дык он уже поди целый проект нахреновертил на этом типе)


 
просто так   (2008-10-15 16:48) [16]

>>Сергей М. [15]
пост достойный мастера! уважаю)), а по существу чтонибудь есть?

>>Object types are supported for backward compatibility only. Their use is not recommended.
зачем нужна такая совместимость, тогда бы уж совсем отказались


 
Сергей М. ©   (2008-10-15 16:52) [17]


> по существу чтонибудь есть?


По существу - в D7 полет нормальный.
Существа в Д2009 я не видел по причине неимения оной.


 
просто так   (2008-10-15 16:55) [18]

D6..D2006, FPC последних версий - всё ок, глючит только в D2009


 
Anatoly Podgoretsky ©   (2008-10-15 17:12) [19]

> просто так  (15.10.2008 16:48:16)  [16]

Для совместимости не нужна, а вот для обратной совместимости да, но это относится к временам 1995 года, сколько же можно!
Борланд предупреждал.
Но это дело программиста, он имеет право использовать и молиться, что бы ничего не произошло.


 
Anatoly Podgoretsky ©   (2008-10-15 17:14) [20]

> Сергей М.  (15.10.2008 16:52:17)  [17]

Вроде уже в 2007 какие то подвижки произошли по данной обратной совместимости, вроде как отказались и ничего уже не гарантируют в данном случае. Но точно не могу сказать, тоже не видел 2007, но по этому поводу были сообщения.


 
Сергей М. ©   (2008-10-15 17:16) [21]


> просто так


А соббсно что тебе мешает внимательно изучить под отладчиком поведение компилятора, найти ляп и накатить злую телегу в КодГир ? С аргументами, естественно, в виде листингов с твоими комментариями ?


 
просто так   (2008-10-15 17:31) [22]

>>Сергей М.
знаний маловато)), попытался ковыряться - помоему информация о типе по которой его инициализирует objsetup в этом случае неверная


 
Sapersky   (2008-10-15 18:22) [23]

все пропало,  KOL "погиб", он то весь на объектах. а никто в конференции kol этого не знает, портируют его под 2009й

В KOL, кстати, объекты создаются динамически как New(<указатель_на_объект>, <имя_конструктора>). _ObjSetup при этом вызывается тоже, но, возможно, правильнее определяется размер объекта (SizeOf(поля) + 4 на VMT). А статическое объявление компилятор (предположительно) считает просто record"ом с размером SizeOf(поля).


 
просто так   (2008-10-15 18:38) [24]

если в [1] заюзать new - ошибка остается


 
просто так   (2008-10-15 18:43) [25]

работает нормально только если все объявления собрать в одном файле


 
Anatoly Podgoretsky ©   (2008-10-15 18:54) [26]

> Сергей М.  (15.10.2008 17:16:21)  [21]

Ничего не мешает, а смысл, если еще 13 лет назад предупредили.


 
DrPass ©   (2008-10-16 02:34) [27]

Непонятно только, зачем предупреждать и что-то там убирать? Возможность создавать статические объекты в языке в общем-то никому не мешала. Да, понятное дело, сейчас можно удобрять методами и обычные записи. Но все равно... наследование, полиморфизьм и прочие радости ООП.


 
Германн ©   (2008-10-16 03:16) [28]


> DrPass ©   (16.10.08 02:34) [27]
>
> Непонятно только, зачем предупреждать и что-то там убирать?
>

Насорил - убери!
А сабж при всех "высказанных", мне всё равно не понятен.
Примите и прочь!


 
просто так   (2008-10-16 10:48) [29]

дядя Германн
>>Насорил - убери!
Т.е. объекты - мусор? с них вообщето ооп начиналось, классы не всегда удобнее - хотябы потомучто они только по ссылке
>>А сабж при всех "высказанных", мне всё равно не понятен.
>>Примите и прочь!
Мне ваш пост тоже непонятен. зачем попусту клаву аммортизировать?
Где в хелпе написано что object не поддерживается? ключевое слово оставлено, более того всё вроде компилируется, но не работает как надо, это глюк компилятора, а не окончание поддержки.


 
просто так   (2008-10-16 10:58) [30]

вот рекорды с методами - мусор)) будет весело если через пару версий они станут «deprecated»


 
Anatoly Podgoretsky ©   (2008-10-16 12:13) [31]

> просто так  (16.10.2008 10:58:30)  [30]

Как раз рекорды с методами и пришли на замену object


 
Сергей М. ©   (2008-10-16 12:26) [32]


> классы не всегда удобнее - хотябы потомучто они только по
> ссылке


А какая тебе разница, по ссылке или не по ссылке ?


 
sniknik ©   (2008-10-16 12:47) [33]

> классы не всегда удобнее - хотябы потомучто они только по
> ссылке
а мне вот до сих пор не понятно, как в статическом объекте, в данных екзешника, будет меняться  виртуальный метод...?
т.е. странно не то, что не работает, странно то что раньше работало... (проверил в D7, действительно идет),
имхо, думаю это своего рода обман от компилятора, который виртуальные методы делает статическими. 2009-м же просто стал "честнее" :).


 
просто так   (2008-10-16 12:52) [34]

например нужен array [0..много], нафиг мне массив ссылок?


 
Сергей М. ©   (2008-10-16 12:54) [35]


> нафиг мне массив ссылок?


А нафих тебе массив стат.записей ?


 
просто так   (2008-10-16 12:57) [36]

>>sniknik
абсолютно также как с классом, тотже vmt, все честно, никакого мошенства))


 
просто так   (2008-10-16 13:04) [37]

>>Сергей М
надо. А нафих ты меня спрашиваешь?
программа - небольшой векторный редактор. например объект точка (2 координаты - 8 байт на объект) делать под него класс? ему будет жирно, рекорд - мне будет неудобно. помоему object разумный компромис


 
Сергей М. ©   (2008-10-16 13:12) [38]


> делать под него класс? ему будет жирно


Вот я и спрашиваю, почему ему будет жирно, а тебе, напротив, неудобно ?
Конкретные аргументы приводи..


 
просто так   (2008-10-16 13:21) [39]

наплимер массив таких точек\классов пожрет дополнительно 50% от своего размера под указатели + создание каждого объекта динамически. незнаю как вас, а меня совесть мучает, я лучше 1 раз память выделю и какнить обойдусь без ссылок.

с рекодами - совесть спокойна, но мозгу хочется плюсов ооп, трудно без наследования, полиморфизма и прочих прелестей


 
sniknik ©   (2008-10-16 13:38) [40]

> абсолютно также как с классом, тотже vmt, все честно, никакого мошенства))
ну да, конечно...
виртуальные методы определяются на этапе создания конструктором. где создание статического объекта? что у него делает "конструктор", если он не "конструирует"?


 
Сергей М. ©   (2008-10-16 13:42) [41]


> лучше 1 раз память выделю


где, в какой секции ?


 
просто так   (2008-10-16 13:53) [42]

>>sniknik
конструктор вписывает адрес vmt в указатель на vmt расположенный в области памяти полей.
>>Сергей М.
выделю 1 раз память под массив в куче.


 
Сергей М. ©   (2008-10-16 13:58) [43]


> выделю 1 раз память под массив в куче


Так тебе ж все равно бежать потом в цикле по этому массиву для конструирования каждого элемента !


 
Anatoly Podgoretsky ©   (2008-10-16 14:05) [44]

> просто так  (16.10.2008 13:53:42)  [42]

Опять же смотрим справку

they provide no built-in constructors, destructors, or other methods


 
Anatoly Podgoretsky ©   (2008-10-16 14:11) [45]

> Сергей М.  (16.10.2008 13:58:43)  [43]

И это будут не статические, а динамические объекты


 
Сергей М. ©   (2008-10-16 14:40) [46]


> Anatoly Podgoretsky ©   (16.10.08 14:11) [45]


Да хоть бы и статические.
Сути не меняет - все равно конструирование в том или ином виде требуется, иначе нафих вообще вся эта бодяга с объектами..


 
Сергей М. ©   (2008-10-16 14:49) [47]

К тому же нафих тут массив объектов ?

Точка она и в африке точка, для ее описания достаточно обычной структуры.

Каким поведением отличаются точки, если их рассматривать как объекты - не понятно ..


 
sniknik ©   (2008-10-16 15:00) [48]

> конструктор вписывает адрес vmt в указатель на vmt расположенный в области памяти полей.
может он и вписывает, просто как переменную (адрес), но вызовы идут как статические. проверь

// a.initxywh;
a.crash;
ShowMessage(IntToStr(integer(a.test)));


и вместо
test:=nil;
записать туда чтото, чтобы было видно
test:= Pointer(-1);

на d7 это работает, что показывает метод crash не виртуальный, вызов как статического/классового.
у тебя это должно дать ошибку, если 2009 "честный".

и кстати, раз ты уж про память объектов заговорил, посмотри на sizeof(zbasic), при стоящим virtual у процедуры, а после убери, и посмотри еще раз. вот тебе те 4 байта которые ты "экономил" на указателе отказавшись от динамических классов. а если ещё такая процедура не одна...


 
Sapersky   (2008-10-16 15:55) [49]

может он и вписывает, просто как переменную (адрес), но вызовы идут как статические.

Вызовы "изнутри" объекта динамические. Т.е. если в объекте-родителе есть вызов виртуальной функции, которая замещена в наследнике, вызовется именно функция наследника.
Хотя и не полноценный полиморфизм, но иногда может быть полезно.

а если ещё такая процедура не одна...

Одна или не одна - неважно, VMT не цепляется полностью к каждому объекту, просто добавляется указатель на неё.
Хотя да, экономия по сравнению с TPoint + TList получается сомнительная, преимущество разве в том, что данные лежат "одним куском". И то этот кусок нельзя, допустим, "одним махом" читать/писать из файла, чтобы не испортить указатели на VMT. В общем, структура данных на любителя...

Ещё тов. "просто так" следует иметь в виду, что объекты не вполне совместимы с compiler magic типами вроде LongString (независимо от версии Дельфи). Впрочем, это вполне соответствует статусу "for backward compatibility only", в старом коде никаких LongString нет.


 
просто так   (2008-10-16 16:53) [50]

>>Каким поведением отличаются точки, если их рассматривать как объекты - не понятно ..
точки к примеру. подойдет любая структура маленкого размера. в моем случае точка
>>И это будут не статические, а динамические объекты
Я не програмист, и наверно тебя не понимаю, но объект можно создать и статически и динамически в отличае от класса
>>Сути не меняет - все равно конструирование в том или ином виде требуется, иначе нафих вообще вся эта бодяга с объектами..
требуется только при наличии виртуальных методов, без них конструктор в принципе можно не вызывать
>>может он и вписывает, просто как переменную (адрес), но вызовы идут как статические. проверь
в данном примере вызовы оптимизируются до статических, пример только чтоб показать ошибку
>>вот тебе те 4 байта которые ты "экономил" на указателе отказавшись от динамических классов. а если ещё такая процедура не одна...
эти 4 байта присутствуют и в классе, даже больше. я говорил про экономию от массива объектов над массивом указателей на объект
>>И то этот кусок нельзя, допустим, "одним махом" читать/писать из файла, чтобы не испортить указатели на VMT. В общем, структура данных на любителя
Писать одним махом в принципе можно, если забить на выравнивания и при чтении прогонять для всех пустой конструктор. но это да, на любителя
>>Ещё тов. "просто так" следует иметь в виду, что объекты не вполне совместимы с compiler magic типами вроде LongString
вышеуказаный товарисч в курсе)) это не смертельно


 
DevilDevil ©   (2008-10-16 16:58) [51]

> просто так   (16.10.08 13:53) [42]

не трать своего драгоценного времени - они не поймут.

Должна быть OOП-структура с виртуальными методами. + должны быть директивы автоконсруктора/автодеструктора. Это моё мнение.


 
DevilDevil ©   (2008-10-16 16:59) [52]

будем надеяться, что object вернут... или хотя бы доделают record


 
просто так   (2008-10-16 17:42) [53]

а смысл доделывать рекорд? чтоб получить обжект который нафиг никому не нужен((?
ох уж этот маркетинг


 
sniknik ©   (2008-10-16 18:03) [54]

> Хотя и не полноценный полиморфизм, но иногда может быть полезно.
возможно.

> Одна или не одна - неважно, VMT не цепляется полностью к каждому объекту, просто добавляется указатель на неё.
--->
> посмотри на sizeof(zbasic)
с классами, и "настоящим" vmt согласен на все 100%, но здесь какое то жалкое подобие...
я не зря по sizeof сказал, в примере, с того с которого начинается ветка у меня (D7) sizeof показывает 8 байт (4 под переменную, 4 под "виртуальный" метод), и при том что "виртуальный" метод не инициализирован (nil вмеcто адреса) вызов его нормально работает, как показывал. и что это значит? то что данные в структуре/"vmt" тут при вызове не используются.
а стоит снять "виртуальность"  они и из структуры пропадают (4 байта становиться).

и то что эти байты не цепляются ко всем объектам это ты не подумав сказал... объекты статические!
делаешь так

var
 a, b, c: zbasic;
 mas: array[0..SizeOf(zbasic)*3] of byte absolute a;
begin
 a.initxywh;
 b.initxywh;
 c.initxywh;
end.


смотри на массив mas при
procedure crash; virtual;
и
test:= Pointer(-1);
очевидно заполнение, и можешь посчитать байты если мне не доверяешь.
после убирай  
procedure crash; //virtual;
и смотри снова. к каждому объекту цепляется или нет.


 
Сергей М. ©   (2008-10-16 18:11) [55]


> просто так   (16.10.08 16:53) [50]
> точки к примеру


Хорошо.

Создай тем же макаром массив полиморфных объектов ..


 
просто так   (2008-10-16 18:29) [56]

>>Сергей М.
Я про фому, ты про ерему, тут мне ненужно 50000 разных объектов, нужно 50000 точек. без выделений памяти под каждый объект отдельно. я прекрасно понимаю что под разные объекты в обном массиве без указателей не обойтись
>>sniknik
почитай хылп про objectы, что значит не полноценный vmt? такойже как у классов, только без шушеры по отрицательному смещению


 
Сергей М. ©   (2008-10-16 18:51) [57]


> просто так   (16.10.08 18:29) [56]


> мне ненужно 50000 разных объектов, нужно 50000 точек


Чудесно.
Возьми да организуй массив структур, описывающих точку.
Нахрен тебе массив объектов-то ? Точка ведь расчудесно описывается структурой..
Нахрен точке методы, да еще и виртуальные ?


 
Сергей М. ©   (2008-10-16 18:54) [58]


> под разные объекты в обном массиве без указателей не обойтись


Ну а чтоже ты тогда тычешь свою точку в кач-ве примера ?


 
просто так   (2008-10-16 19:15) [59]

Серега. топик про ошибку в обжектах, а не про убеждения меня что мне нужно, что ненужно


 
Сергей М. ©   (2008-10-16 19:26) [60]

Нет там ошибки. Тебе уже сказали про "честность" в  Д2009.


 
sniknik ©   (2008-10-16 19:32) [61]

> что значит не полноценный vmt?
а вот то что я вижу, и примерами пытаюсь "донести", адрес записывается как переменная, и при вызове не используется. (в 2009м возможно уже не так)
это полноценно?

> только без шушеры по отрицательному смещению
так эта "шушера" реально будет только один раз для класса, см.
Sapersky   (16.10.08 15:55) [49]
где он про vmt пишет. это как раз к классам относится.


 
просто так   (2008-10-16 20:03) [62]

Уважаемый sniknik, данный метод 100% виртуальный, то что вы этого не увидели - или не туда смотрели или (менее вероятно) происки оптимизатора. VMT для обжектов - хранит адреса виртуальных методов и инициализируется при компиляции. ссылка на vmt которая добавляется к полям объекта при первом появлении виртуального метода - инициализируется конструктором (адрес vmt передается конструктору в регистре edx при вызове)


 
просто так   (2008-10-16 20:05) [63]

>>Сергей М.
прежде чем так категорично заявлять, я бы на вашем месте качнул 2009 и проверил))


 
GrayFace ©   (2008-10-16 20:14) [64]

В D2006, похоже, тоже VMT у объектов не инициализируется. SizeOf вообще мусор возвращает. И property в объектах еще в D7 не работали, в D2006, правда, не проверял.

Sapersky   (16.10.08 15:55) [49]
Вызовы "изнутри" объекта динамические. Т.е. если в объекте-родителе есть вызов виртуальной функции, которая замещена в наследнике, вызовется именно функция наследника.
Хотя и не полноценный полиморфизм, но иногда может быть полезно.

Полиморфизм, вроде, полноценный. Если передавать ссылку, пытается вызвать виртуально.

Сергей М. ©   (16.10.08 18:51) [57]
Нахрен точке методы, да еще и виртуальные ?

Обычные методы, безусловно, нужны. Например, свойство Length.

sniknik ©   (16.10.08 19:32) [61]
а вот то что я вижу, и примерами пытаюсь "донести", адрес записывается как переменная, и при вызове не используется. (в 2009м возможно уже не так)
это полноценно?

Дак подебаж и все увидешь - записывается адрес VMT, а не метода. Не используется только когда это не нужно - если тип объекта очевиден.
Посмотри SizeOf у этого:
type
 TA = object
   q:integer;
   function aaa:int; virtual;
   procedure bbb; virtual;
 end;


 
Sapersky   (2008-10-16 20:14) [65]

и то что эти байты не цепляются ко всем объектам это ты не подумав сказал...

Я несколько другое говорил:

VMT не цепляется полностью к каждому объекту

т.е. о том, что размер объекта не зависит от кол-ва виртуальных функций в нём. Мне показалось, что здесь вы утверждали обратное:

вот тебе те 4 байта которые ты "экономил" на указателе отказавшись от динамических классов. а если ещё такая процедура не одна...

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

 TMyObject = object
   i : Integer;
   constructor Create;
   destructor Destroy; virtual;
   procedure DoSmth; virtual;
 end;

 TMySecObj = object (TMyObject)
   procedure DoSmth; virtual;
 end;

constructor TMyObject.Create;
begin
DoSmth; // здесь вызовется DoSmth от TMySecObj через VMT
end;

Var mo : TMySecObj;
begin
mo.Create;

Полагаю, что при динамическом создании объектов "внешние" вызовы виртуальных функций у них тоже будут динамическими. Иначе непонятно, зачем в книгах по Турбо-Паскалю употреблялось слово "полиморфизм" :)


 
GrayFace ©   (2008-10-16 20:17) [66]

просто так, и все-таки когда нужны object"ы (плохи record"ы с классами)?


 
oxffff ©   (2008-10-16 20:31) [67]


> просто так   (13.10.08 21:08)  


12.0.3155.16733.

Полет нормальный.

ABase=object
procedure abc;virtual;abstract;
end;

PABase=^ABase;

ADerived=object(ABase)
procedure abc;virtual;
constructor create;
end;

{ ADerived }

procedure ADerived.abc;
begin
showmessage("ADerived");
end;

constructor ADerived.create;
begin
inherited;
//Do nothing
end;

procedure TForm2.FormCreate(Sender: TObject);
var a:ADerived;
   p:PABase;
begin
p:=@a;
a.create;
p.abc;
end;


 
oxffff ©   (2008-10-16 20:46) [68]

Динамическое создание

var
   pd:^ADerived;
begin

new(pd,create);
dispose(pd);

d2009 полет нормальный. Буду после 22-00.


 
просто так   (2008-10-16 20:51) [69]

>>oxffff
а из [1]? c пределениями в разных файлах?
>>GrayFace
Да сколько можно? любой случай большого массива маленьких данных. рекорды мне неудобны по причине отсутствия поддержки рекордов с методами в fpc и delphi < 2007. виртуальные методы в примере только чтобы показать ошибку


 
Сергей М. ©   (2008-10-16 21:03) [70]


> просто так   (16.10.08 20:05) [63]


Только лишь ради проверки твоей блажи ?
А оно мне надо ?)


 
GrayFace ©   (2008-10-16 21:07) [71]

просто так   (16.10.08 20:51) [69]
Да сколько можно? любой случай большого массива маленьких данных. рекорды мне неудобны по причине отсутствия поддержки рекордов с методами в fpc и delphi < 2007.

Столько, сколько нужно чтобы получить ответ. Тогда лучше делать условную компиляцию с object"ами для старых версий и record"ами для новых.


 
просто так   (2008-10-16 21:17) [72]

>>Только лишь ради проверки твоей блажи ?
не, чтоб не быть голословным


 
oxffff ©   (2008-10-16 23:01) [73]


> просто так   (16.10.08 20:51) [69]
> >>oxffff
> а из [1]? c пределениями в разных файлах?


Да действительно есть проблема.
Она заключается в том, что при инициализации экземпляра в метаклассе не корректно содержится информация о смещении VMT в экземпляре.
В метаклассе отступ +0 от начала экземпляра, а при вызове используется отступ +4(где соответственно мусор).

НО!!!

Чуть чуть шаманства и твоя проблема решена.

Сделай так.

   zBase=object
   procedure EmptyVirtual;virtual;
   end;

   zgui=object(zBase)

  { zBase }
  procedure zBase.EmptyVirtual;
  begin
 //
 end;

Аплодисменты!!! Занавес!!!!


 
oxffff ©   (2008-10-16 23:21) [74]


> просто так  


Писать в QC смысла нет, поскольку там администрируют реальные дятлы, им объяснишь в чем проблема, они скажут только проблема не зафиксирована.

Например я писал, что невиртуальный вызов GetEnumerator виртуального метода в конструкции for in. Сказали мы не видим проблемы. Но ... поправили в будущих версиях.

Писал им про потенциальные утечки памяти при многократном вызове конструктора record. Сказали мы не видим проблемы. Не знаю поправили или нет сейчас. Вообщем забил я на QС и на всю их команду.
Дятлы одним словом. Честно наболело.


 
oxffff ©   (2008-10-16 23:24) [75]


> oxffff ©   (16.10.08 23:21) [74]


Слава богу, что хороший DRUM&BASS радует душу.


 
просто так   (2008-10-16 23:48) [76]

>>Сделай так.
т.е. пустой предок? непомогло, помогает только всё собрать в один файл


 
oxffff ©   (2008-10-16 23:51) [77]


> просто так   (16.10.08 23:48) [76]


Не пустой предок, а прекод с виртуальным методом. Что зафиксировать смещение VMT в 0.


 
oxffff ©   (2008-10-16 23:53) [78]


> просто так   (16.10.08 23:48) [76]


В итоге zguis.pas выглядит

type
   zBase=object
   procedure EmptyVirtual;virtual;
   end;

   zgui=object(zBase)
   test:pointer;
   procedure crash;virtual;
   constructor create;
   end;

implementation

procedure zgui.crash;
begin
test:=nil;
end;

constructor zgui.create;
begin
   crash; //тут уже нет AV
end;

{ zBase }
procedure zBase.EmptyVirtual;
begin
//
end;


 
просто так   (2008-10-17 00:35) [79]

спсб, вроде заработало. но это тоже не выход((


 
Германн ©   (2008-10-17 01:35) [80]


> просто так   (17.10.08 00:35) [79]
>
> спсб, вроде заработало. но это тоже не выход((
>

А какой выход ты хотел бы? Волшебную палочку?
P.S. Пустопорожняя тема, а длится уже более трёх суток. И мой пост уже 80-й.


 
просто так   (2008-10-17 01:56) [81]

>>P.S. Пустопорожняя тема, а длится уже более трёх суток. И мой пост уже 80-й.
Всем спасибо, тема закрыта


 
Германн ©   (2008-10-17 02:32) [82]


> просто так   (17.10.08 01:56) [81]
>
> >>P.S. Пустопорожняя тема, а длится уже более трёх суток.
>  И мой пост уже 80-й.
> Всем спасибо, тема закрыта
>

"Закрыть" тему может только модератор. А он пока не захотел её закрывать.


 
DevilDevil ©   (2008-10-17 14:57) [83]

> просто так   (16.10.08 17:42) [53]
> а смысл доделывать рекорд? чтоб получить обжект который
> нафиг никому не нужен((?


object (или аналогичный ) нужен всем, только они ещё об этом не знают. Преимуществ record над object-ом невижу никаких! Преимущества objectа над record-ами: наследование, виртуальные методы, секции private/public/protected.

Если честно, я вообще не вижу причин, по которым нельзя сделать record-ы с VMT или продвигать object, а record оставить для обратной совместимости.

Проблема только одна - расположение VMT.
В С++ VMT не обязательно хранится по нулевому смешению.
Приведу аналоги на Delphi.

type
 TMyPoint = object(TPoint)
 public
   function Length(): integer; virtual;
 end;


Если реализовать то же самое в С++, то VMT будет по смещению 8байт. А вообще можно организовать так:

VMT
X: integer;
Y: integer;


И при вызове функции, где TMyPoint должен приводиться к TPoint:
var
 MyPoint: TMyPoint;
begin
 MyPoint.Create();
 Windows.GetCursorPos(@MyPoint{!!!});


на уровне compiler magic должен пихаться указатель не на MyPoint, а на MyPoint+4. Вот и все проблемы.


 
oxffff ©   (2008-10-20 08:43) [84]


> Если честно, я вообще не вижу причин, по которым нельзя
> сделать record-ы с VMT


А мы например очень это видим. Причина простая record - это конечный тип, который связан со всеми методами на момент компиляции. И смысл делать позднее связывание полностью отсутствует. :)


 
просто так   (2008-10-20 09:11) [85]

>>А мы например очень это видим. Причина простая record - это конечный тип, который связан со всеми методами на момент компиляции

object без виртуальных методов - тоже, в нем нет вмт, тотже рекорд с методами, зачем херить старую провереную фичу и вводить новую аналогичную?

>>Проблема только одна - расположение VMT. В С++ VMT не обязательно хранится по нулевому смешению.

в delphi также. vmt появляется при первом виртуальном методе, по текущему смещению


 
oxffff ©   (2008-10-20 09:34) [86]


> object без виртуальных методов - тоже, в нем нет вмт, тотже
> рекорд с методами, зачем херить старую провереную фичу и
> вводить новую аналогичную?


Затем, что ввели другую идеалогию размещения объекта, в куче.


> в delphi также. vmt появляется при первом виртуальном методе,
>  по текущему смещению


В любом объекте (от class) уже есть виртуальные методы.


 
oxffff ©   (2008-10-20 09:34) [87]


> object без виртуальных методов - тоже, в нем нет вмт, тотже
> рекорд с методами, зачем херить старую провереную фичу и
> вводить новую аналогичную?


Затем, что ввели другую идеалогию размещения объекта, в куче.


> в delphi также. vmt появляется при первом виртуальном методе,
>  по текущему смещению


В любом объекте (от class) уже есть виртуальные методы.


 
просто так   (2008-10-20 10:20) [88]

>>Затем, что ввели другую идеалогию размещения объекта, в куче.
в обжекте легко реализовать что размещение в куче, что в стеке тут он практичнее.
>>В любом объекте (от class) уже есть виртуальные методы.
в object`е они есть только когда это надо програмисту, тоже имхо практичнее


 
oxffff ©   (2008-10-20 10:32) [89]


> просто так   (20.10.08 10:20) [88]


Чем практичнее?

-Тем что нельзя сделать динамическое инстранцирование
-нельзя прикрутить интерфейсы к объекту
-нельзя прикрутить procedure of object.

Все это ограничение стекового размещения.

Или JAVA, .NET не по тому пути пошли?


 
просто так   (2008-10-20 12:04) [90]

>>-Тем что нельзя сделать динамическое инстранцирование
можно
>>-нельзя прикрутить интерфейсы к объекту
это да
>>-нельзя прикрутить procedure of object.
можно, прекрасно работает


 
oxffff ©   (2008-10-20 15:37) [91]


> просто так   (20.10.08 12:04) [90]
> >>-Тем что нельзя сделать динамическое инстранцирование


А как ты собираешься делать динамическое создание на стеке?
Это возможно только для объектов кучи.


> можно
> >>-нельзя прикрутить интерфейсы к объекту
> это да

Следующее это то же самое. Проблема на том, что интерфейс должен существовать при выходе объекта из области видимости.
Это возможно только для объектов кучи.

> >>-нельзя прикрутить procedure of object.
> можно, прекрасно работает


Это возможно только для объектов кучи. Поскольку захватив метод объекта ты(это самое первое closure в delphi, еще до 2009) гарантировать время его жизни при выходе из scope.
Это возможно только для объектов кучи.


 
просто так   (2008-10-20 16:48) [92]

>>oxffff

>>Это возможно только для объектов кучи.
тебе религия запрещает объект в куче создать?


 
oxffff ©   (2008-10-20 17:21) [93]


> просто так   (20.10.08 16:48) [92]


Я тебе пояснил  преимущества новой объектной модели.
Мне то все понятно. :)


 
просто так   (2008-10-20 17:40) [94]

отсутствие возможности создать класс статически естественно как недостаток не рассматривается)?


 
oxffff ©   (2008-10-20 19:30) [95]


> просто так   (20.10.08 17:40) [94]


Это ты о чем?


 
GrayFace ©   (2008-10-20 23:12) [96]

Не понятно, о чем тут спорить. Ни одного довода в пользу удирания object"ов ведь не было. Не понятно, чем они мешали CG.


 
Vga ©   (2008-10-21 06:37) [97]


> Не понятно, чем они мешали CG.

Ничем не мешали, больше всего похоже что их случайно сломали.



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

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

Наверх




Память: 0.75 MB
Время: 0.018 c
2-1254422362
Anatoly Podgoretsky
2009-10-01 22:39
2009.11.15
AV при сложение AnsiString и UnicodeString в D2010


2-1254289329
Johnnnnn
2009-09-30 09:42
2009.11.15
Управление с клавиатуры &amp;


15-1252968869
dmk
2009-09-15 02:54
2009.11.15
Твердотельные HDD


15-1253039747
GanibalLector
2009-09-15 22:35
2009.11.15
Самопроизвольная остановка службы "Телефония"


2-1254405490
Blondin
2009-10-01 17:58
2009.11.15
Антикейлоггер