Текущий архив: 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.81 MB
Время: 0.028 c