• oxffff © (01.09.08 23:13) [160]

    > jack128_   (01.09.08 22:59) [159]


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

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

    P.S. Включи оптимизацию и перестрой.
  • jack128_ (01.09.08 23:22) [161]
    она включена.
  • oxffff © (01.09.08 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_ (02.09.08 00:53) [163]
    Хм. Чудеса..  Щас запустил по новой дельфи, асм код глянуть.  Терь External error выдает..  Всё страньше и страньше, как говорила Алиса...
  • oxffff © (02.09.08 08:30) [164]

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


    Это не чудеса. Это ребята из Codegear.
  • oxffff © (02.09.08 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 (02.09.08 16:02) [166]

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

    В исходнике UTF-8 представление буквы "я". Какая может быть зависимость от ввода?
  • федот (04.09.08 14:20) [167]
    Очередная версия 3168.16957
  • oxffff © (05.09.08 10:24) [168]
    Читать всем.
    smart pointers in delphi
    http://barrkel.blogspot.com/2008/09/smart-pointers-in-delphi.html
  • speller (05.09.08 10:38) [169]
    после д7 без бутылки в д2009 хрен разберешься во всех новшествах, произошедших за этот период )
  • jack128_ (05.09.08 10:55) [170]
    да ладно - их по пальца одной руки пересчитать мона.
    1) хелперы
    2) advanced records
    3) анонимные функции/замыкания
    4) дженерики

    Ну и там по мелочи, типа strict и Exit(FuncResult)...
  • Skyle © (05.09.08 11:12) [171]

    > jack128_   (05.09.08 10:55) [170]

    5. Перегрузка операторов.
  • Anatoly Podgoretsky © (05.09.08 13:15) [172]
    > Skyle  (05.09.2008 11:12:51)  [171]

    Так на руке как раз 5 пальцев.
  • jack128_ (05.09.08 13:34) [173]

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

    это входит в Advanced records. Перегрузка операторов только для них допустима..
  • jack128_ (06.09.08 13:05) [174]

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

    прикольно.  Хотя в принципе - всё тоже самое можно и в 2007 сделать.
  • guav © (06.09.08 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_ (06.09.08 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 © (06.09.08 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_ (06.09.08 14:06) [178]

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

    например???  То есть я понимаю, что при желании где угодно можэно ошибок наляпать.  Имеются в виду неочевидные какие нить ошибки
  • guav © (06.09.08 14:23) [179]
    Если у нас два разных смарт-поинтера, то может так получится что из одного сконтсруировали другой, и (вместо ожидаемого: увеличения общего числа ссылок/передачи владения/ошибки компиляции) оба будут владеть.

    Не уверен что это применимо к Delphi (вообще Delphi у меня нет, я просто так сюда захожу), но в С++ это известная проблема.
Есть новые Нет новых   [134442   +15][b:0.001][p:0.001]