-
> jack128_ (01.09.08 22:59) [159]
У меня версия 12.0.3155.16733.
То есть получается они не делают, а ломают.
Нормально это исключение?
P.S. Включи оптимизацию и перестрой.
-
она включена.
-
Вот код для
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
-
Хм. Чудеса.. Щас запустил по новой дельфи, асм код глянуть. Терь External error выдает.. Всё страньше и страньше, как говорила Алиса...
-
> jack128_ (02.09.08 00:53) [163]
> Хм. Чудеса..
Это не чудеса. Это ребята из Codegear.
-
Еще вот чудеса.
Нельзя использовать 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
-
> Похоже, в случае с Ord('я') просто компилятор подставляет
> константу. Может для чистоты эксперимента попробуете строку
> взять из элемента формы?
В исходнике UTF-8 представление буквы "я". Какая может быть зависимость от ввода?
-
Очередная версия 3168.16957
-
-
после д7 без бутылки в д2009 хрен разберешься во всех новшествах, произошедших за этот период )
-
да ладно - их по пальца одной руки пересчитать мона.
1) хелперы
2) advanced records
3) анонимные функции/замыкания
4) дженерики
Ну и там по мелочи, типа strict и Exit(FuncResult)...
-
> jack128_ (05.09.08 10:55) [170]
5. Перегрузка операторов.
-
> Skyle (05.09.2008 11:12:51) [171]
Так на руке как раз 5 пальцев.
-
> 5. Перегрузка операторов.
это входит в Advanced records. Перегрузка операторов только для них допустима..
-
-
-
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; - это глюк или политика партии??
-
> [176] jack128_ (06.09.08 13:44)
> class operator Implicit(const AValue: TSmartPointer<T>):
> T; - это глюк или политика партии??
Кстати в С++ у стандартных сматр-поинтеров shared_ptr, auto_ptr, scoped_ptr и других нету неявного преобразования в обычный указатель, хотя оно могло бы быть реализовано. Вместо него - метод get(). Тут политика партии: такое неявное преобразования показало себя как источник ошибок.
-
> такое неявное преобразования показало себя как источник
> ошибок.
например??? То есть я понимаю, что при желании где угодно можэно ошибок наляпать. Имеются в виду неочевидные какие нить ошибки
-
Если у нас два разных смарт-поинтера, то может так получится что из одного сконтсруировали другой, и (вместо ожидаемого: увеличения общего числа ссылок/передачи владения/ошибки компиляции) оба будут владеть.
Не уверен что это применимо к Delphi (вообще Delphi у меня нет, я просто так сюда захожу), но в С++ это известная проблема.