Главная страница
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, все честно, никакого мошенства))
ну да, конечно...
виртуальные методы определяются на этапе создания конструктором. где создание статического объекта? что у него делает "конструктор", если он не "конструирует"?



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

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

Наверх




Память: 0.56 MB
Время: 0.014 c
15-1253048409
Германн
2009-09-16 01:00
2009.11.15
Ещё о Windows CE


15-1253028542
TUser
2009-09-15 19:29
2009.11.15
Нет ли у кого-нибудь совсем старого железа?


2-1254139166
defen
2009-09-28 15:59
2009.11.15
пРОБЛЕМА С listbox


3-1229418698
belmol
2008-12-16 12:11
2009.11.15
blob


15-1253313038
DVM
2009-09-19 02:30
2009.11.15
Как путь типа SystemRoot ... превратить в нормальный?