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

Вниз

Д2009   Найти похожие ветки 

 
oxffff ©   (2008-09-01 23:13) [160]


> jack128_   (01.09.08 22:59) [159]


У меня версия 12.0.3155.16733.
То есть получается они не делают, а ломают.

Нормально это исключение?

P.S. Включи оптимизацию и перестрой.


 
jack128_   (2008-09-01 23:22) [161]

она включена.


 
oxffff ©   (2008-09-01 23:27) [162]

Вот код для

procedure TGenericRecord<T>.DoSomething(aParam: T);
var a:integer;
begin
a:=integer((@aParam)^);          //  Он здесь, привет EDX регистру
showmessage(inttostr(a));
end;

Unit1.pas.40: begin
0046C610 55               push ebp
0046C611 8BEC             mov ebp,esp
0046C613 6A00             push $00
0046C615 53               push ebx
0046C616 33C0             xor eax,eax
0046C618 55               push ebp
0046C619 6850C64600       push $0046c650
0046C61E 64FF30           push dword ptr fs:[eax]
0046C621 648920           mov fs:[eax],esp
Unit1.pas.41: a:=integer((@aParam)^);          //  Он здесь, привет EDX  
                                                             регистру
0046C624 8DC2             lea eax,quiet_dl   <-валится на этой инструкции

0046C626 8B18             mov ebx,[eax]
Unit1.pas.42: showmessage(inttostr(a));
0046C628 8D55FC           lea edx,[ebp-$04]
0046C62B 8BC3             mov eax,ebx
0046C62D E8EAE2F9FF       call IntToStr


 
jack128_   (2008-09-02 00:53) [163]

Хм. Чудеса..  Щас запустил по новой дельфи, асм код глянуть.  Терь External error выдает..  Всё страньше и страньше, как говорила Алиса...


 
oxffff ©   (2008-09-02 08:30) [164]


> jack128_   (02.09.08 00:53) [163]
> Хм. Чудеса..


Это не чудеса. Это ребята из Codegear.


 
oxffff ©   (2008-09-02 09:07) [165]

Еще вот чудеса.

Нельзя использовать ASM в параметризованном классе.

AClass<T>=class
procedure abc(const a:T);
procedure cde;
end;

procedure AClass<T>.abc(const a: T);
asm
end;                                  <-- жалуется

procedure AClass<T>.cde;
asm
end;                                  <-- жалуется

[DCC Error] Unit1.pas(39): E2426 Inline function must not have asm block


 
speller   (2008-09-02 16:02) [166]


> Похоже, в случае с Ord("я") просто компилятор подставляет
> константу. Может для чистоты эксперимента попробуете строку
> взять из элемента формы?

В исходнике UTF-8 представление буквы "я". Какая может быть зависимость от ввода?


 
федот   (2008-09-04 14:20) [167]

Очередная версия 3168.16957


 
oxffff ©   (2008-09-05 10:24) [168]

Читать всем.
smart pointers in delphi
http://barrkel.blogspot.com/2008/09/smart-pointers-in-delphi.html


 
speller   (2008-09-05 10:38) [169]

после д7 без бутылки в д2009 хрен разберешься во всех новшествах, произошедших за этот период )


 
jack128_   (2008-09-05 10:55) [170]

да ладно - их по пальца одной руки пересчитать мона.
1) хелперы
2) advanced records
3) анонимные функции/замыкания
4) дженерики

Ну и там по мелочи, типа strict и Exit(FuncResult)...


 
Skyle ©   (2008-09-05 11:12) [171]


> jack128_   (05.09.08 10:55) [170]

5. Перегрузка операторов.


 
Anatoly Podgoretsky ©   (2008-09-05 13:15) [172]

> Skyle  (05.09.2008 11:12:51)  [171]

Так на руке как раз 5 пальцев.


 
jack128_   (2008-09-05 13:34) [173]


> 5. Перегрузка операторов.

это входит в Advanced records. Перегрузка операторов только для них допустима..


 
jack128_   (2008-09-06 13:05) [174]


> Читать всем.
> smart pointers in delphi
> http://barrkel.blogspot.com/2008/09/smart-pointers-in-delphi.
> html

прикольно.  Хотя в принципе - всё тоже самое можно и в 2007 сделать.


 
guav ©   (2008-09-06 13:38) [175]

> [168] oxffff ©   (05.09.08 10:24)


smart pointers in delphi
http://barrkel.blogspot.com/2008/09/smart-pointers-in-delphi.html


Смарт поинтеры ? Скоп гарды ? Иммитация замыканий ?
Осталось finally запретить и будет вам С++ :)


 
jack128_   (2008-09-06 13:44) [176]

var
 x: TSmartPointer<TLifetimeWatcher>;
begin
 x := TLifetimeWatcher.Create


Хм. Что то мне подумалось, что это не правельно - когда время жизни объекта опредлеяется способом декларации переменной, в котой этот объект сидит. По идее - этот мемент должен разруливаться способом _создания_ объекта.

то есть вместо
var
 Form: TSmartPointer<TForm>;
begin
 Form := TForm.Create(nil);
end;
лудше бы писать:
var
 Form: TForm;
begin
 Form :=TSmartPointer<TForm>.Create(TForm.Create(nil)).Value;
end;
так конечно длиннее, но зато потом при вызове методов не нуно будет писать ".Value.", например Form.Value.SameMethod

PS Кста, то что невозможно описать оператор
class operator Implicit(const AValue: TSmartPointer<T>): T;  - это глюк или политика партии??


 
guav ©   (2008-09-06 13:58) [177]

> [176] jack128_   (06.09.08 13:44)


> class operator Implicit(const AValue: TSmartPointer<T>):
> T;  - это глюк или политика партии??

Кстати в С++ у стандартных сматр-поинтеров shared_ptr, auto_ptr, scoped_ptr и других нету неявного преобразования в обычный указатель, хотя оно могло бы быть реализовано. Вместо него - метод get(). Тут политика партии: такое неявное преобразования показало себя как источник ошибок.


 
jack128_   (2008-09-06 14:06) [178]


> такое неявное преобразования показало себя как источник
> ошибок.

например???  То есть я понимаю, что при желании где угодно можэно ошибок наляпать.  Имеются в виду неочевидные какие нить ошибки


 
guav ©   (2008-09-06 14:23) [179]

Если у нас два разных смарт-поинтера, то может так получится что из одного сконтсруировали другой, и (вместо ожидаемого: увеличения общего числа ссылок/передачи владения/ошибки компиляции) оба будут владеть.

Не уверен что это применимо к Delphi (вообще Delphi у меня нет, я просто так сюда захожу), но в С++ это известная проблема.


 
jack128_   (2008-09-06 14:33) [180]

хм.  Да, ничего хорошего..
ну да ладно, и в таком виде нормально выглядит..


 
oxffff ©   (2008-09-06 16:43) [181]


> jack128_   (06.09.08 14:33) [180]


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


 
jack128_   (2008-09-06 16:58) [182]


> Я бы так не сказал. В его примере дополнительно создается
> два объекта кучи.

Ну дополнительных - только один объект создается. Во вторых - а что предлагаешь ты??  Внедрить объекты на стеке (или деструкторы у рекордов) в язык??  И так много новоодений..


 
jack128_   (2008-09-06 16:59) [183]


> новоодений

нововведений


 
oxffff ©   (2008-09-07 11:33) [184]


> jack128_   (06.09.08 16:58) [182]
>
> > Я бы так не сказал. В его примере дополнительно создается
>
> > два объекта кучи.
>
> Ну дополнительных - только один объект создается. Во вторых
> - а что предлагаешь ты??  Внедрить объекты на стеке (или
> деструкторы у рекордов) в язык??  И так много новоодений.
> .


Объекта создается два. См. код

constructor TSmartPointer<T>.Create(const AValue: T);
begin
 FValue := AValue;
 FLifetime := TLifetimeWatcher.Create(procedure
 begin
   AValue.Free;
 end);
end;

Объекты

1.TLifetimeWatcher
2. Обертка анонимного метода с захватом AValue.

Нововведений? :)

Все они есть Delphi.NET.

Так что это не нововведения. :)


 
oxffff ©   (2008-09-07 11:52) [185]


> Так что это не нововведения. :)


А скорее старовведения.


 
jack128_   (2008-09-07 15:25) [186]


> Обертка анонимного метода с захватом AValue

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

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


> Все они есть Delphi.NET.
>
> Так что это не нововведения. :)

ну мало ли что есть в .NET"е... давай еще скажем, что в delphi for win сборку мусора ввести - раз плюнуть и это никакое не нововедение будет...


 
oxffff ©   (2008-09-07 16:02) [187]


> ну мало ли что есть в .NET"е... давай еще скажем, что в
> delphi for win сборку мусора ввести - раз плюнуть и это
> никакое не нововедение будет...


:)

см.

http://www.delphi.org/tag/garbage-collection/

скачать здесь
http://cc.codegear.com/Item/21646


 
jack128_   (2008-09-07 16:19) [188]


> http://www.delphi.org/tag/garbage-collection/

эм.. на слух английским только по глубокой пьяни владею. :-)


> http://cc.codegear.com/Item/21646

не..  щас я готов открывать приплюснутые исходники. А вот из дельфиских:

function Gc_FreeMem(p: Pointer): Integer;
begin
 // do nothing
 Result := 0;
end;

Это уже радует.


 
oxffff ©   (2008-09-07 16:58) [189]


> эм.. на слух английским только по глубокой пьяни владею.
>  :-)


Мне легче я еще под градусом со вчерашнего. :)


 
guav ©   (2008-09-07 17:21) [190]

> [178] jack128_   (06.09.08 14:06)

Вот ещё вспомнил, почему неявно умный указатель не преобразуют в обычный:

std::shared_ptr<someclass> get_some();
void use_some(someclass *);

неявное преобразование:
std::shared_ptr<someclass> p = get_some(); // правильно
use_some(p);
someclass* p = get_some(); // неправильно, временный объект разрушится при ;
use_some(p);
get:
std::shared_ptr<someclass> p = get_some(); // правильно
use_some(p.get());
someclass* p = get_some().get(); // неправильно, но теперь выглядит подозрительно.
use_some(p);


 
jack128_   (2008-09-07 19:19) [191]


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

а вот в дельфи - smart pointer разрушится только при выходе из процедуры


 
guav ©   (2008-09-07 20:16) [192]


> а вот в дельфи - smart pointer разрушится только при выходе
> из процедуры

а даже если ведёт себя как локальная переменная, можно сломать:
1. циклом, тогда объект последующей итерации будет создаваться на месте пердыдущего.
2. попыткой использовать после выхода из процедуры.

Вот смотри на аналогию: PChar это указатель на объект, а AnsiString - смарт-поинтер. Приведение AnsiString к PChar - олько явное.


 
pasha_golub ©   (2008-09-09 09:03) [193]

Ребят, а у меня вот вопрос. Если имеем С функцию экспортируемую из некой ДЛЛ, например,

       int return_int(const char *somename);


То ранее я ее определял как
Treturn_int = function(somename: PChar): Integer; cdecl;

В случае с Тибуроном это остается в силе? Или следует менять на PAnsiChar или того хуже TBytes?

Если последнее, то каким макаром мне передать функции данные в кодировке UTF8? Ведь PChar у нас будет хранить UTF16, вроде как... С этим TEncoding голова пухнет.


 
jack128_   (2008-09-09 10:28) [194]


> Или следует менять на PAnsiChar

конечно следует менять.
PChar - теперь эквивалентен PWideChar


 
clickmaker ©   (2008-09-09 10:35) [195]

> C := TMyClass<Integer>.Create.Free;
> КАк так?

ну передумал создавать - чего непонятного?


 
pasha_golub ©   (2008-09-09 12:39) [196]


> jack128_   (09.09.08 10:28) [194]

Хорошо, получится что это теперь
Treturn_int = function(somename: PAnsiChar): Integer; cdecl;

А как мне туда запихнуть содержимое строки? Чего-нибудь в таком роде:

var S: string; //UNT16
begin
..
 i := return_int(PAnsiChar(UnicodeToUTF8(S));
...
end;


Вообщем, как-то я не могу сложить разум в кучу по этому поводу. Опять же сколько надо терминирующих нулей вопрос. Ранее один впулил и доволен. Теперича, я так понимаю, два надобно?


 
KilkennyCat ©   (2008-09-09 12:40) [197]


> clickmaker ©  

а ты не получал еще диск с 2009?


 
clickmaker ©   (2008-09-09 12:44) [198]

> [197] KilkennyCat ©   (09.09.08 12:40)

не-а
я с дельфи почти не работаю. Так, шабашки мелкие на 5-ке в основном


 
KilkennyCat ©   (2008-09-09 12:50) [199]


> clickmaker ©   (09.09.08 12:44) [198]

понятно... ладно, буду ждать октября...


 
Anatoly Podgoretsky ©   (2008-09-09 13:21) [200]


> pasha_golub ©   (09.09.08 09:03) [193]

PChar generic тип, значит нужно использовать фундаментальный PAnsiChar



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

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

Наверх




Память: 0.83 MB
Время: 0.032 c
15-1222602793
Дмитрий С
2008-09-28 15:53
2008.11.30
Молчаливый OleVariant


2-1224769834
Piero
2008-10-23 17:50
2008.11.30
Двумерный массив в классе


15-1222744713
Maxer123
2008-09-30 07:18
2008.11.30
Urban Kraftway K23


2-1224233607
sD
2008-10-17 12:53
2008.11.30
Загрузка файлов в базу


2-1224233625
Vlad Oshin
2008-10-17 12:53
2008.11.30
как Определить активное окно, но хитро - позже клика?