• Palladin © (05.05.08 17:42) [80]

    > ПостОвый терминатор ©   (05.05.08 17:38) [79]

    А ведь кто-то, буквально ~8 минут назад, флуданул в другой ветке. Не будем показывать пальцами, но это был слоненок.
  • Игорь Шевченко © (05.05.08 17:44) [81]
    ПостОвый терминатор ©   (05.05.08 17:38) [79]

    А зачем ты в начинающих пишешь под чужими никами ? Накажу.
  • ПостОвый терминатор © (05.05.08 17:47) [82]

    > Игорь Шевченко ©   (05.05.08 17:44) [81]

    Не понял, а каком посте идет речь?
  • Пробегал2... (05.05.08 18:50) [83]
    Игорь Шевченко ©   (05.05.08 15:33) [46]
    прежде чем спорить, про предмет спора почитай малость


    а я ни с чем не спорил. Перечитываем дружно два раза.
  • oxffff © (05.05.08 20:40) [84]
    Итак приступим


    > Григорьев Антон ©   (05.05.08 16:36) [70]
    >
    > > oxffff ©   (05.05.08 15:48) [52]
    > > type
    > > TXFUNC=function (const a:TvarRec):TvarRec;
    > >
    > > function abc(var List:array of const;func:TXFUNC):integer;
    >
    > >
    > > var i:integer;
    > > begin
    > > for i:=0 to length(List)-1 do LIST[i]:=func(LIST[i]);
    > > end;
    > >
    > > function XSample(const a:TvarRec):TvarRec;
    > > begin
    > >
    > > end;
    > >
    > > procedure TForm1.Button1Click(Sender: TObject);
    > > var a:array of TVarRec;
    > > begin
    > > abc(A,XSample);
    > > end;
    >
    > Не компилируется abc([1,'a', 2], XSample), т.е. константный
    > список кушать не хочет. В Лиспе с этим проблем нет. Я уж
    > молчу о том, что чтобы правильно сформировать содержимое
    > массива a, надо будет повозиться с полями TVarRec, что очень
    > неудобно. Полиморфизм функции XSample тоже не так просто
    > сделать.


    А разве должно?
    function abc(var )

    Однако кто вам мешает сделать так?

    type
    TXFUNC=function (const a:TvarRec):TvarRec;
    VarRecArray=array of TVarRec;

    function abc(var List:array of const;func:TXFUNC):integer;
    var i:integer;
    begin
    for i:=0 to length(List)-1 do LIST[i]:=func(LIST[i]);
    end;

    function XSample(const a:TvarRec):TvarRec;
    begin

    end;

    function TrickInit(const List:array of const):VarRecArray;
    begin
    Setlength(result,length(list));
    copyMemory(result,@list,sizeof(TvarRec)*length(List));
    end;


    procedure TForm1.Button1Click(Sender: TObject);
    var A:VarRecArray;
    begin
    A:=TrickInit([1,'2',3,4]);
    abc(A,XSample);
    end;
  • oxffff © (05.05.08 20:58) [85]
    Продолжим.


    > Григорьев Антон ©   (05.05.08 16:36) [70]
    > oxffff ©   (05.05.08 15:50) [54]
    > Как у вас с ООП?
    > Видимо, очень плохо. Потому что не представляю, при чём
    > вообще ООП, когда я хочу выполнить простые операции над
    > типами integer, real, char и т.п.


    Идея состоит в том, что вы создаете иерархию классов оберток для типов в том числе и для элементарных. И определяете унарные операции над типом ввиде например интерфейсов, виртуальных методов, или published методов, т.е. все с поздним связыванием.

    Используя аналогичную идею как с TCustomvariant
  • Игорь Шевченко © (05.05.08 21:06) [86]
    Пробегал2...   (05.05.08 18:50) [83]

    Эт ты сказки рассказывай где-нибудь еще. Ты тут личность давно известная, повадки твои тоже. Так еще раз - прежде чем спорить, изучи предмет спора.
  • oxffff © (05.05.08 21:07) [87]

    > Григорьев Антон ©   (05.05.08 16:36) [70]
    >
    > Да, читали. Но TCustomVariant - это всё-таки не элементарный
    > тип, а обеспечивать полиморфизм на уровне простых типов
    > Delphi не умеет.
    >
    > Получил ожидаемый результат - исключение в строке с синусом.
    >  Потому что такие фокусы проходят только когда v содержит
    > указатель на IDispatch, т.е. простые типы опять пролетают
    > как фанера над Парижем. Ответ насчёт стандартной функции
    > sin не засчитывается.


    Это вам задание на дом, а именно как прикрутить disp вызовы к элементарным типам. Подумайте.
  • oxffff © (05.05.08 21:15) [88]

    > Игорь Шевченко ©   (05.05.08 16:42) [72]
    > oxffff ©   (05.05.08 16:20) [67]
    >
    > Мне будет крайне интересна передача классов в иерархии через
    > TVarRec
    >
    > type
    >  TFooBase = class
    >  public
    >     procedure SomeMethod (Param: TParam); virtual;
    >  end;
    >
    >  TFoo = class(TFooBase)
    >  ...
    >  end;
    >  TBar = class(TFoo)
    >  ...
    >  public
    >     procedure SomeMethod (Param: TParam); override;
    >  end;
    >
    > То есть, при generic-ах я могу написать
    >
    >  type
    >    TFooList = TList<TFoobase>
    >    public
    >     ...
    >      procedure ApplySomeMethod (Param: TParam);
    >    end;
    >
    > procedure TFooList.ApplySomeMethod (Param: TParam);
    > var
    >  I: Integer;
    > begin
    >  for I:=0 to Count-1 do
    >    Items[I].SomeMethod (Param);
    > end;


    Я не понял вашего вопроса?
  • Grids (05.05.08 21:31) [89]

    > ПостОвый терминатор ©   (05.05.08 17:38) [79]
    > Господа, заинтересованные! Извините еще в очередной раз.
    >  Позвольте спросить, что Вам мешает открыть соответствующую
    > (новую) обсуждению ветку? А не флудить в ветке автора, которого
    > ваша "переписка" похоже не интересует:(

    Мне показалось, что меня не поняли:(
    Или на самом деле на этом форуме все ...
    Еще раз прошу извинить за резкость (просто становится обидно за форум)
  • Григорьев Антон © (05.05.08 22:12) [90]

    > oxffff ©   (05.05.08 20:40) [84]
    > Однако кто вам мешает сделать так?
    <...>
    procedure TForm1.Button1Click(Sender: TObject);
    var A:VarRecArray;
    begin
    A:=TrickInit([1,'2',3,4]);
    abc(A,XSample);
    end;

    А если понадобится так?
    procedure TForm1.Button1Click(Sender: TObject);
    var A:VarRecArray;
    begin
    A:=TrickInit([1,'abc',3,4]);
    abc(A,XSample);
    end;
    Будете использовать CopyMemory с автоматически финализируемым типом?
  • oxffff © (05.05.08 22:34) [91]

    > Будете использовать CopyMemory с автоматически финализируемым
    > типом?


    А может изучить мат. часть?

     TVarRec = record { do not pack this record; it is compiler-generated }
       case Byte of
         vtInteger:    (VInteger: Integer; VType: Byte);
         vtBoolean:    (VBoolean: Boolean);
         vtChar:       (VChar: Char);
         vtExtended:   (VExtended: PExtended);
         vtString:     (VString: PShortString);
         vtPointer:    (VPointer: Pointer);
         vtPChar:      (VPChar: PChar);
         vtObject:     (VObject: TObject);
         vtClass:      (VClass: TClass);
         vtWideChar:   (VWideChar: WideChar);
         vtPWideChar:  (VPWideChar: PWideChar);
         vtAnsiString: (VAnsiString: Pointer);
         vtCurrency:   (VCurrency: PCurrency);
         vtVariant:    (VVariant: PVariant);
         vtInterface:  (VInterface: Pointer);
         vtWideString: (VWideString: Pointer);
         vtInt64:      (VInt64: PInt64);
     end;
  • oxffff © (05.05.08 22:36) [92]

    > oxffff ©   (05.05.08 22:34) [91]
    >
    > > Будете использовать CopyMemory с автоматически финализируемым
    >
    > > типом?
    >
    >
    > А может изучить мат. часть?
    >
    >  TVarRec = record { do not pack this record; it is compiler-
    > generated }
    >    case Byte of
    >      vtInteger:    (VInteger: Integer; VType: Byte);
    >      vtBoolean:    (VBoolean: Boolean);
    >      vtChar:       (VChar: Char);
    >      vtExtended:   (VExtended: PExtended);
    >      vtString:     (VString: PShortString);
    >      vtPointer:    (VPointer: Pointer);
    >      vtPChar:      (VPChar: PChar);
    >      vtObject:     (VObject: TObject);
    >      vtClass:      (VClass: TClass);
    >      vtWideChar:   (VWideChar: WideChar);
    >      vtPWideChar:  (VPWideChar: PWideChar);
    >      vtAnsiString: (VAnsiString: Pointer);
    >      vtCurrency:   (VCurrency: PCurrency);
    >      vtVariant:    (VVariant: PVariant);
    >      vtInterface:  (VInterface: Pointer);
    >      vtWideString: (VWideString: Pointer);
    >      vtInt64:      (VInt64: PInt64);
    >  end;
  • Игорь Шевченко © (05.05.08 23:37) [93]
    oxffff ©   (05.05.08 21:15) [88]


    > Я не понял вашего вопроса?


    Есть иерархия. Она описана. Есть шаблонный класс списка классов из этой иерархии. Я описал гипотетический пример, как класс списка мог бы выглядеть с применением generic-ов, и как это выглядит в C# и С++
    насколько я понял, ты предлагаешь реализовать функциональность generic-ов через TVarRec
    Вот мне и любопытно увидеть реализацию моего гипотетического примера с помощью TVarRec
  • Ketmar © (06.05.08 01:09) [94]
    а можно я скажу, можно? привет, придурки!

    Игорь, Розыч — ну не удаляйте. разве я не прав?

    зыж для остальных: Кэтмар — ламер. это общеизвестный факт.
  • oxffff © (06.05.08 09:05) [95]

    > Игорь Шевченко ©   (05.05.08 23:37) [93]
    > oxffff ©   (05.05.08 21:15) [88]
    >
    >
    > > Я не понял вашего вопроса?
    >
    >
    > Есть иерархия. Она описана. Есть шаблонный класс списка
    > классов из этой иерархии. Я описал гипотетический пример,
    >  как класс списка мог бы выглядеть с применением generic-
    > ов, и как это выглядит в C# и С++
    > насколько я понял, ты предлагаешь реализовать функциональность
    > generic-ов через TVarRec
    > Вот мне и любопытно увидеть реализацию моего гипотетического
    > примера с помощью TVarRec


    вопрос был про TYPE ANY (шаблонные) функции.
  • Polevi (06.05.08 09:27) [96]
    >oxffff ©   (06.05.08 09:05) [95]
    многое можно сделать через ж
    но не нужно
  • Григорьев Антон © (06.05.08 09:34) [97]

    > oxffff ©   (05.05.08 22:34) [91]
    > А может изучить мат. часть?

    Учите. Вам знаний матчасти как раз очень не хватает.

    Берём ваш код и слегка дополняем, чтобы можно было получить какой-то результат.

    type
     TXFUNC=function (const a:TvarRec):TvarRec;
     VarRecArray=array of TVarRec;

    function abc(var List:array of const;func:TXFUNC):integer;
    var
     i:integer;
    begin
     for i:=0 to length(List)-1 do
       LIST[i]:=func(LIST[i]);
     Result:=0;
    end;

    function XSample(const a:TvarRec):TvarRec;
    begin
     Result:=a;
    end;

    function TrickInit(const List:array of const):VarRecArray;
    begin
     Setlength(result,length(list));
     copyMemory(result,@list,sizeof(TvarRec)*length(List));
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var A:VarRecArray;
       S:string;
    begin
     S:='abc';
     UniqueString(S);
     A:=TrickInit([S]);
     S:='123';  {*}
     abc(A,XSample);
     ASSERT(A[0].VType = vtAnsiString);
     Label1.Caption:=string(A[0].VAnsiString)
    end;



    Функция XSample оставляет переданное ей значение без изменения, поэтому следует ожидать появления в Label1 текста 'abc', который был присвоен переменной S, переданной затем в качестве элемента массива. Тем не менее, на экране появляется непонятно что (проверено в Delphi 7). А вот если убрать строку, отмеченную звёздочкой, будет, как и ожидалось, строка "abc".

    Поясню, что здесь происходит. С помощью UniqueString мы добиваемся того, что значение S хранится в динамической памяти со счётчиком ссылок, равным 1. Когда мы передаём это значение в конструктор открытого вариантного массива, указатель на эту строку тупо копируется как простой указатель, который и сохраняется в нулевом элементе массива A. Механизм подсчёта ссылок при этом не включается. И когда переменной S присваивается другое значение, память, занимаемая строкой, считается свободной, и что там будет располагаться - это как повезёт. А в A[0] при этом сохраняется этот битый указатель, в результате чего мы и имеем проблемы. Кстати, рекомендую попробовать после строки со звёздочкой вставить UniqueString(S) - увидите ещё один интересный эффект :))

    Кстати, я вчера задал вам несколько вопросов по поводу ваших предложений, но для ответа вы почему-то выбрали только один из них, скромно умолчав про остальные.

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

    Конечно, можно в вашу функцию TrickInit добавить контроль за счётчиком ссылок или вообще преобразование, сводящее всё к PChar и ручному управлению памятью. Потребуется ещё куча функций, которые будут в разных ситуациях отвечать за правильное освобождение памяти в нужный момент. Но удобно ли будет пользоваться такой библиотекой с такими наворотами? Да ещё и с учётом того, что для работы с ней подходит не любой тип данных, а специально организованный, и не любая функция, а только специально написанная? Предлагаю вам остановится на таком завершении спора: "В Delphi, сильно извратившись, можно написать библиотеку, которая, при добровольном соблюдении её пользователем кучи ограничений, позволит ему программировать в стиле, похожем на Лисп. Но для решения любой практической задачи будет удобнее писать в стиле Delphi, чем использовать такую библиотеку".
  • euru © (06.05.08 09:34) [98]

    > Alkid ©   (05.05.08 17:22) [76]
    > А на ABAP как mapcar написать? :)))


    Например, можно так:

    form mapcar
        using    in_table  type index table
                 func_name type string
        changing out_table type index table
    .
    field-symbols: <in>, <out>.

      clear out_table.
      loop at in_table assigning <in>.
        append initial line to out_table assigning <out>.
        perform (func_name) in program (sy-cprog)
            using    <in>
            changing <out>
        .
      endloop.
    endform.

  • Игорь Шевченко © (06.05.08 09:35) [99]
    oxffff ©   (06.05.08 09:05) [95]


    > вопрос был про TYPE ANY (шаблонные) функции.


    Переведи пожалуйста, я не понял ответа
Есть новые Нет новых   [134435   +8][b:0.001][p:0.002]