Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
Собственно, решил попробовать их на вкус. Сделал, как в этом примере
+ сам код
uses ...fgl...
type
  TMyClass = class(TObject)
     fld1 : string;
  end;

  TMyList = specialize TFPGObjectList<TMyClass>; 

//===================
procedure TForm1.Button1Click(Sender: TObject);
var
  list : TMyList;
  c : TMyClass;
  i: Integer;
begin
  list := TMyList.Create;
  c := TMyClass.Create;
  Memo1.Clear;

  try
    {1}
    for i := 0 to 10 do
    begin
      c.fld1 := 'c' + IntToStr(i);
      list.Add(c);
    end;

    for i := 0 to Pred(list.Count) do
      Memo1.Lines.Add(IntToStr(i) + '. ' + list[i].fld1);

    Exit; 

    {2}
    c.fld1:= 'c100';
    list.Insert(3,c);
    for i := 0 to Pred(list.Count) do
      Memo1.Lines.Add(IntToStr(i) + '. ' + list[i].fld1);
  finally
    {3}
    //FreeAndNil(c);
    //FreeAndNil(list);
  end;
end;  
 
+ результат {1}
0. c10
1. c10
2. c10
3. c10
4. c10
5. c10
6. c10
7. c10
8. c10
9. c10
10. c10
+ результат{2}
0. c100
1. c100
2. c100
3. c100 //хотелось бы видеть это значение только в этой позиции
4. c100
5. c100
6. c100
7. c100
8. c100
9. c100
10. c100
11. c100

Ну и в случае {3}, если не комментить код после finally, то получаю
+
[Window Title]
Ошибка
[Content]
Проект project1 вызвал класс исключения 'External: SIGSEGV'.
 По адресу 10C034
[ОК]

ЧЯДНТ? Я неправильно понимаю их область применения?

зы. кстати, компилятор выдал кучу хинтов типа
+
Компиляция проекта, цель: project1.exe: Успешно, подсказок: 18
fgl.pp(978,1) Hint: "inherited" not yet supported inside inline procedure/function
fgl.pp(978,1) Hint: Inlining disabled

=================
Док.

Win7 Ultim x64/Deb 8.7 i386:
FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb),
Lazarus 1.9(r.55042); FPC 3.1.1 (r.36290), IBX by -Rik-; IBE 2017.4.19.2
18 июн 17, 17:53    [20573115]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Док
ЧЯДНТ?

Cоздаёшь единственный объект, а потом удивляешься результату :)
18 июн 17, 18:01    [20573123]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
Kazantsev Alexey
Док
ЧЯДНТ?

Cоздаёшь единственный объект, а потом удивляешься результату :)

понятно.
А что с разрушением?
18 июн 17, 18:06    [20573130]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Док
А что с разрушением?

А чего ты ожидаешь убивая объект несколько раз? (я полагаю TFPGObjectList по дефолту является владельцем хранимых объектов).
18 июн 17, 18:10    [20573133]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
Kazantsev Alexey,

поправил код
+
procedure TForm1.Button1Click(Sender: TObject);
var
  list : TMyList;
  c : TMyClass;
  i: Integer;
begin
  list := TMyList.Create;
  //c := TMyClass.Create;
  Memo1.Clear;
  try
    {1}
    for i := 0 to 10 do
    begin
      c:= TMyClass.Create;
      c.fld1 := 'c' + IntToStr(i);
      list.Add(c);
    end;

    //for i := 0 to Pred(list.Count) do
    //  Memo1.Lines.Add(IntToStr(i) + '. ' + list[i].fld1);

    //Exit;

    {2}
    c:= TMyClass.Create;
    c.fld1:= 'c100';
    list.Insert(3,c);
    for i := 0 to Pred(list.Count) do
      Memo1.Lines.Add(IntToStr(i) + '. ' + list[i].fld1);
  finally
    {3}
    //FreeAndNil(c);
    FreeAndNil(list);
  end;

теперь с ожидаемым результатом
+
0. c0
1. c1
2. c2
3. c100
4. c3
5. c4
6. c5
7. c6
8. c7
9. c8
10. c9
11. c10

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

Я хочу уяснить на будущее, если я их не буду уничтожать, то память потечет?
18 июн 17, 18:26    [20573149]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Док
Но даже теперь нет понятно, почему уничтожение и объекта, и листа все равно приводит к выше указанной ошибке.

Я же тебе уже сказал, что твой лист, скорее всего, сам удаляет хранимые объекты. Параметры конструктора-то посмотри.
18 июн 17, 18:35    [20573161]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 885
Если ты в этих классах хранишь всего лишь свойства, как информацию о чём либо - то. То лучше использовать структуры, так как их не надо ручками создавать и удалять
18 июн 17, 18:40    [20573166]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
чччД
Guest
Док,
обычно у таких списков есть свойство "владелец объектов". Оно иногда по умолчанию включено, иногда - выключено, смотри исходники.
Это значит, что все, что ты положил в список, будет удалено (вызовом деструктора вложенного объекта) при разрушении списка.
Например, ты кнопки на форму кидаешь. Потом, при разрушении формы, кнопки тоже разрушаются.
18 июн 17, 18:43    [20573169]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
alekcvp
Member

Откуда:
Сообщений: 2730
https://www.freepascal.org/docs-html/rtl/fgl/tfpgobjectlist.html
property FreeObjects: Boolean; [rw]
Does the list own the objects or not?


Если у тебя list.FreeObjects = True, то, как уже сказали выше, он сам вызывает Free у хранимых объектов при уничтожении списка.
18 июн 17, 18:53    [20573181]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
alekcvp
Если у тебя list.FreeObjects = True

Kazantsev Alexey
Параметры конструктора-то посмотри.

Ага, теперь понятно
Няшик
лучше использовать структуры

Че-та я их не могу понять куда и и как в один из 4 классов (TFPGList, TFPGObjectList, TFPGInterfacedObjectList, TFPGMap), описанных в fgl, их прикрутить. Если создавать свой тип дженерика, как описано в мануале
  generic TList<T> = class
    Items: array of T;
    procedure Add(Value: T);
  end;

  TRecList = specialize TList<TMyRec>;

то придется вручную описывать остальные свойства и процедуры. А хотелось бы готовых :)
18 июн 17, 20:32    [20573297]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
чччД
Guest
Док, вот с "созданием" записей:

type
  RMyRec = record
    i : integer;
    s : string;
  end;
var
  fL : TList<RMyRec>;
  fpR : ^RMyRec;
  i : Integer;
const c_Iter = 10;
begin
  fL := TList<RMyRec>.Create;
  try
    for i := 1 to c_Iter do begin
      New(fpR);
      fpR.i := i;
      fpR.s := '# ' + IntToStr(i);
      fl.Add(fpR^)
    end;
  finally
...


Это я с Delphi Tokyo играюсь... какой крутецкий отладчик, все элементы списка видно:

К сообщению приложен файл. Размер - 11Kb
18 июн 17, 21:07    [20573333]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 885
чччД,

Тебе не кажется что, создание указателя - это лишние ?
18 июн 17, 21:48    [20573377]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
чччД
Guest
Кстати, TList<> сам выделяет (и освобождает) память для данных типа <T>, и в данном случае fl.Add(fpR^) - всего лишь копирование значений из временной переменной.
Стало быть, в цикле должен быть Dispose этой временной переменной:
    for i := 1 to c_Iter do begin
      New(fpR);
      fpR.i := i;
      fpR.s := '# ' + IntToStr(i);
      fl.Add(fpR^);
      Dispose(fpR);
    end;
18 июн 17, 22:02    [20573392]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
чччД
Guest
Няшик
чччД,

Тебе не кажется что, создание указателя - это лишние ?

Так Док вроде как раз страдает по этому поводу - куда непонятное заранее количество деть, массив какой-то завёл.
А так - да, не нужно.
18 июн 17, 22:10    [20573405]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
чччД
Это я с Delphi Tokyo играюсь...

Вот теперь то же самое, только на Лазаре.

"Я посмотрел бы на него, когда б было минус 30..." © :)

чччД
Так Док вроде как раз страдает по этому поводу

Док не страдает, Док изучает, прежде чем сказать, что дженерики на Лазаре гавно до уровня Дельфей еще надо пилить и пилить.

Есть сторонняя библиотека, но и там типа TList<TArray> тоже нет. Так что, для моих целей ближе всего все-таки использовать свой класс с полями нужного типа.
18 июн 17, 23:17    [20573458]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Док
что дженерики на Лазаре гавно до уровня Дельфей еще надо пилить и пилить

Всё ровно наоборот. Муа-ха-ха.
Док
Есть сторонняя библиотека, но и там типа TList<TArray> тоже нет.

Ты же на транке вроде? В транк давно уже спарту интегрировали, подключай Generics.Collections...
18 июн 17, 23:46    [20573470]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
чччД
Guest
Док,

ну ты скажи, где лазарус взять, чтобы такой, как у тебя и без гемора при установке - я и попробую.
19 июн 17, 00:01    [20573477]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
чччД
ну ты скажи, где лазарус взять

легко. Можешь попробовать собрать так.
Kazantsev Alexey
подключай Generics.Collections..

и ты молчал? :)
19 июн 17, 00:13    [20573485]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Док
Можешь попробовать собрать так.

Зачем такие сложности... Ходишь сюда, качаешь утиль под свою ОС, устанавливаешь нажатием одной кнопки.

Док
и ты молчал? :)

А ты не те вопросы задаешь
19 июн 17, 00:20    [20573490]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
чччД
Guest
Скачал лазарус отсюда: http://www.lazarus-ide.org/ - нет там файла Generics.Collection

Док
чччД
ну ты скажи, где лазарус взять

легко. Можешь попробовать собрать так.
...


Да ну, страшно.
19 июн 17, 00:44    [20573501]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
чччД
Скачал лазарус отсюда: http://www.lazarus-ide.org/ - нет там файла Generics.Collection

ССЗБ
19 июн 17, 00:49    [20573505]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
Kazantsev Alexey
А ты не те вопросы задаешь

Мог бы и подсказать, тем более, что нас, лазаристов, мало :)

Вроде разобрался
+
uses
... Generics.Collections;
type

  TMyRec = packed record
    FInt: Integer;
    FBool: Boolean;
  end;

  TMyRecList = specialize TList<TMyRec>;   

procedure TForm1.Button1Click(Sender: TObject);
var
  RL: TMyRecList;
  MR: TMyRec;
  i: Integer;
  BoolStr: String;
begin
  RL:= TMyRecList.Create;
  try
    Memo1.Clear;
    for i := 0 to 10 do
    begin
      MR.FInt:= i;
      MR.FBool:= ((i mod 2) = 1);
      RL.Add(MR);
    end;

    MR.FInt:= 1000;
    MR.FBool:= True;

    RL.Insert(5,MR);

    MR.FInt:= - 1000;
    MR.FBool:= False;

    RL.Insert(8,MR); 

    for i := 0 to Pred(RL.Count) do
    begin
      if RL.Items[i].FBool
        then
          BoolStr:= 'True'
        else
          BoolStr:= 'False';

      Memo1.Lines.Add(Format('%d. FInt = %d | FBool = %s',[i,RL.Items[i].FInt,BoolStr]));
    end;

  finally
    FreeAndNil(RL);
  end;

end;
+ результат
0. FInt = 0 | FBool = False
1. FInt = 1 | FBool = True
2. FInt = 2 | FBool = False
3. FInt = 3 | FBool = True
4. FInt = 4 | FBool = False
5. FInt = 1000 | FBool = True
6. FInt = 5 | FBool = True
7. FInt = 6 | FBool = False
8. FInt = -1000 | FBool = False
9. FInt = 7 | FBool = True
10. FInt = 8 | FBool = False
11. FInt = 9 | FBool = True
12. FInt = 10 | FBool = False 

Еще раз хотел уточнить, FreeAndNil нужно писать или об этом TList<T> позаботится? Будет ли криминалом, если я буду по привычке уничтожать то, что создал своими руками?
19 июн 17, 01:37    [20573528]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
чччД
Guest
Kazantsev Alexey
чччД
Скачал лазарус отсюда: http://www.lazarus-ide.org/ - нет там файла Generics.Collection

ССЗБ


Вот оно мне так надо.
19 июн 17, 01:38    [20573529]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
чччД
Guest
Док
...
Еще раз хотел уточнить, FreeAndNil нужно писать или об этом TList<T> позаботится? Будет ли криминалом, если я буду по привычке уничтожать то, что создал своими руками?


Если у тебя в список TList<> залиты экземпляры классов - нужно уничтожать руками.
Если "простые типы" (целые, строки, записи из целых и строк...) - не нужно уничтожать. Если в записи есть поля "классового" типа ("объекты") - нужно пройтись по всем элементам и уничтожить такие объекты.
19 июн 17, 01:42    [20573530]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Док
FreeAndNil нужно писать или об этом TList<T> позаботится?

Конкретно TList<T> сам ничего не уничтожает. TObjectList<T> в зависимости от опции владения объектами.

Док
Будет ли криминалом, если я буду по привычке уничтожать то, что создал своими руками?

Это ортогонально дженерикам. Но вообще, либо уничтожаешь сам, либо поручаешь кому-то, как в том случае со списком-контейнером владеющим объектами.
19 июн 17, 01:52    [20573532]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
чччД
Вот оно мне так надо

тебе 3 батника запустить поочередно гораздо сложнее, чем кликать 10 раз по кнопке "Next" в инсталляторе дельфей? Тогда понятно, почему ты так долго на D2007 сидел, а теперь пузыри пускаешь, увидев отладчик Tokyo :)

кроме того, там Лазарь ставится как portable, хоть на флешку, не мусоря в реестре.

Kazantsev Alexey
Но вообще, либо уничтожаешь сам, либо поручаешь кому-то, как в том случае со списком-контейнером владеющим объектами.

Я ж спросил на конкретном примере, мне нужно уничтожать конкретно созданный мной экземпляр-контейнер RL или это сделает TList<T>? :)
19 июн 17, 08:26    [20573643]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Док
Я ж спросил на конкретном примере, мне нужно уничтожать конкретно созданный мной экземпляр-контейнер RL или это сделает TList<T>? :)

Разумеется, ты сам должен заботится об уничтожении списка.
19 июн 17, 09:23    [20573708]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
Kazantsev Alexey,

Спасибо. Собственно, теперь все.
19 июн 17, 09:47    [20573763]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3788
Нашли generics.collection? Я его полтора года назад находил без проблем.
Нормальные в лазаре дженерики, насколько я знаю.
19 июн 17, 19:31    [20575905]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
makhaon
Нормальные в лазаре дженерики, насколько я знаю.

про которые из трех ты говоришь? :)

1. если про sparta, то в версии 1.6.4, то в стандартной поставке там только папка dockedformeditor. В нынешнем виде она есть в транке (возможно была и в 1.7)
2. если про те, что описаны в fgl.pas, то мне их функционал показался очень и очень куцым
3. если про TemplateGenerics, то там тоже не айс, имхо, нет гибкости спарты

зы. Про "в лазаре дженерики" будет иметь смысл говорить, когда они будут, как минимум, в сорцах fpc лежать, ПМСМ.
20 июн 17, 00:04    [20576201]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Док
Про "в лазаре дженерики" будет иметь смысл говорить, когда они будут, как минимум, в сорцах fpc лежать, ПМСМ.

Спартовские в транке лежат. Ну и есть ещё fcl-stl.
20 июн 17, 00:40    [20576238]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3788
Док,

Sparta. Вполне живые. Я как-то проблем с ними не замечал.
20 июн 17, 00:48    [20576244]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
Kazantsev Alexey
Спартовские в транке лежат.

makhaon
Sparta. Вполне живые.

Наверное, единственные юзабельные, КМК.

Пошел пользовать. Алексу персональный спасиб за наводку
20 июн 17, 12:03    [20576963]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Cobalt747
Member

Откуда:
Сообщений: 2282
Док,

Расскажи потом, в чём отличие от дельфовских.
20 июн 17, 14:40    [20577628]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
Cobalt747
Расскажи потом, в чём отличие от дельфовских

с дельфей слез лет 5 как, Лазарь с каждым релизом устраивает более, чем. Помочь не смогу :)
20 июн 17, 16:16    [20578018]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Cobalt747
Расскажи потом, в чём отличие от дельфовских.

Спартовские калька с дельфийских.
20 июн 17, 16:24    [20578037]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
Kazantsev Alexey,

я так понимаю, это был сарказм :)
20 июн 17, 17:03    [20578174]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Док
я так понимаю, это был сарказм :)

Эм... Нет. Спартовские generics.collections есть калька с дельфийских generics.collections, и сделаны они были именно для совместимости с дельфями.
20 июн 17, 17:12    [20578203]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Док
Member

Откуда: Казань
Сообщений: 6966
Kazantsev Alexey,


щас перечитал свой последний пост и понял, что ты не так поймешь.

Это со стороны Cobalt747, вероятно, был сарказм.
20 июн 17, 17:19    [20578215]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Cobalt747
Member

Откуда:
Сообщений: 2282
Док
Это со стороны Cobalt747, вероятно, был сарказм.
Отнюдь. Мне интересно узнать в чем отличаются дженерики свободного сообщества и коммерческого ПО.
23 июн 17, 13:14    [20585860]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Cobalt747
интересно узнать в чем отличаются дженерики свободного сообщества и коммерческого ПО

На уровне RTL ничем, на уровне языка фпц'шные дженерики это почти шаблоны, а дельфийские так, баловство.
23 июн 17, 16:29    [20586580]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Жышы
Member [заблокирован]

Откуда:
Сообщений: 656
Kazantsev Alexey
Cobalt747
интересно узнать в чем отличаются дженерики свободного сообщества и коммерческого ПО

На уровне RTL ничем, на уровне языка фпц'шные дженерики это почти шаблоны, а дельфийские так, баловство.


Пример кто-нибудь продемонстрирует?
23 июн 17, 16:35    [20586607]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Жышы
Пример кто-нибудь продемонстрирует?

Пример чего?
23 июн 17, 16:40    [20586627]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Kazantsev Alexey,

Пример чем они круче.
23 июн 17, 16:51    [20586650]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
rgreat
Пример чем они круче

Ну попробуй на дельфях реализовать банальное сложение для типа <T>.
23 июн 17, 16:57    [20586666]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Жышы
Member [заблокирован]

Откуда:
Сообщений: 656
Kazantsev Alexey
rgreat
Пример чем они круче

Ну попробуй на дельфях реализовать банальное сложение для типа <T>.


Примера не будет?
23 июн 17, 17:01    [20586685]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Понятно.
23 июн 17, 17:03    [20586691]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Жышы
Примера не будет?

Примера на дельфях не будет, ибо слишком много писанины, а на фпц это одна строчка: result := a + b;

rgreat
Понятно.

Этим не ограничивается. Возьмём другой пример. У тебя коллекция имеющая метод ToString, который должен вернуть строковое представление всех хранимых данных. Писать такое на дельфийских дженериках - проще застрелиться, а на фпц'шных пишется элементарно:
+
program project1;

{$mode delphiunicode}

Uses

 SysUtils;

type

 TRec<T> = Record

  FItems : Array Of T;


  Procedure Add(Const AValue : T);

  Function ToString : String;

 End;

{ TRec }

Procedure TRec<T>.Add(Const AValue : T);
Begin

 SetLength(FItems, Length(FItems) + 1);
 FItems[High(FItems)] := AValue;

End;

Function TRec<T>.ToString : String;
Var

 i : Integer;

Begin

 Result := '';

 For I := Low(FItems) To Pred(High(FItems)) Do
  Result := Result + FItems[i].ToString + sLineBreak;

 Result := Result + FItems[High(FItems)].ToString;

End;

var

 r : TRec<Integer>;

Begin

 r.Add(1);
 r.Add(2);
 r.Add(3);
 r.Add(4);
 r.Add(5);

 WriteLn(r.ToString);

End.

И работать будет с любым типом имеющим метод ToString. А если нужный тип не имеет такого метода, то для него пишется тайпхелпер реализующий этот метод. Аналогично всё будет работать и с любыми операциями приведения типов, и даже с учётом перегрузки операторов.
23 июн 17, 17:19    [20586761]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Жышы
Member [заблокирован]

Откуда:
Сообщений: 656
Реализацию примера на дельфях я и так представляю, на лазарусе кто бы показал.
23 июн 17, 17:26    [20586797]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Жышы
на лазарусе кто бы показал

Специально для тебя:
а на фпц это одна строчка: result := a + b;
23 июн 17, 17:32    [20586835]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Kazantsev Alexey
Этим не ограничивается. Возьмём другой пример. У тебя коллекция имеющая метод ToString, который должен вернуть строковое представление всех хранимых данных. Писать такое на дельфийских дженериках - проще застрелиться, а на фпц'шных пишется элементарно
Да в общем ясно. В дельфях пое-аться надо пиcателю дженерик класса, а в лазаре его пользователю. :)
23 июн 17, 17:33    [20586844]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Жышы
Member [заблокирован]

Откуда:
Сообщений: 656
Kazantsev Alexey,

непонятно.

Для типа
pRMyRec = ^RMyRec;
RMyRec = record
  o : TObject;
  i : Integer;
  pr : pRMyRec;
end;

- сложение покажи.
23 июн 17, 17:36    [20586854]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
rgreat
а в лазаре его пользователю. :)

Шта? В дельфях тебе так же будет нужен метод ToString, если захочешь корректного представления, а не как ты его себе видишь. Только для этого ты с ещё с RTTI попляшешь, что конечно очень молодёжно и вообще передово.
23 июн 17, 17:45    [20586871]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Жышы
сложение покажи

Переопределяешь оператор сложения в своём типе, а код дженерика остаётся прежним.
23 июн 17, 17:46    [20586879]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Жышы
Member [заблокирован]

Откуда:
Сообщений: 656
Kazantsev Alexey
Жышы
сложение покажи

Переопределяешь оператор сложения в своём типе, а код дженерика остаётся прежним.


Не-по-нят-но.
23 июн 17, 17:58    [20586910]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Жышы,

Класс оператор сложения писать надо.
23 июн 17, 18:04    [20586924]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Жышы
Member [заблокирован]

Откуда:
Сообщений: 656
rgreat
Жышы,

Класс оператор сложения писать надо.


В где?
23 июн 17, 18:08    [20586929]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Жышы,

pRMyRec = ^RMyRec;
RMyRec = record
  o : TObject;
  i : Integer;
  pr : pRMyRec;

  class operator Add(const A,B: RMyRec ): RMyRec; overload;
end;
23 июн 17, 18:13    [20586941]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Жышы
Не-по-нят-но.

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Operator_Overloading_(Delphi)
RMyRec = record
 ...
 Class Operator Add(Const ALeft, ARight : RMyRec) : RMyRec;

end;

...
Class Operator RMyRec.Add(Const ALeft, ARight : RMyRec) : RMyRec;
Begin
...
End;
23 июн 17, 18:14    [20586947]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Жышы
Member [заблокирован]

Откуда:
Сообщений: 656
rgreat
Жышы,

pRMyRec = ^RMyRec;
RMyRec = record
  o : TObject;
  i : Integer;
  pr : pRMyRec;

  class operator Add(const A,B: RMyRec ): RMyRec; overload;
end;

А в лазарусе - не надо, сам собой сложится?
23 июн 17, 18:14    [20586948]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Жышы
Member [заблокирован]

Откуда:
Сообщений: 656
Kazantsev Alexey
Жышы
Не-по-нят-но.

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Operator_Overloading_(Delphi)
RMyRec = record
 ...
 Class Operator Add(Const ALeft, ARight : RMyRec) : RMyRec;

end;

...
Class Operator RMyRec.Add(Const ALeft, ARight : RMyRec) : RMyRec;
Begin
...
End;

Это я знаю. Я не знаю, как в лазарусе.
23 июн 17, 18:15    [20586950]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Жышы,

В лазарусе как раз надо. Не надо в дельфях.

Там проблема сложить 2 абстрактных типа лежит на писателе генерик класса.
23 июн 17, 18:16    [20586952]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Жышы
Member [заблокирован]

Откуда:
Сообщений: 656
rgreat
Жышы,

В лазарусе как раз надо. Не надо в дельфях.

Там проблема сложить 2 абстрактных типа лежит на писателе генерик класса.


Вы меня путает. А ведь у меня уже есть собственный персональный путаник!
...
Может, кто-то покажет код и в лазарусе и дельфи?
23 июн 17, 18:25    [20586975]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Жышы
Я не знаю, как в лазарусе

В фпц также. Кому, как не автору типа знать, каким образом правильно выполнять операции над своим типом. Код дженерика при этом остаётся простым и неизменным.


rgreat
Не надо в дельфях.

Там проблема сложить 2 абстрактных типа лежит на писателе генерик класса.

Не надо, агащазблин. В дельфях тоже надо, иначе наскладываешь там абстрактно такого... Просто в дельфях придётся лезть за методом оператора в RTTI. В общем, дженерики дельфийские это боль. Будь они нормальными, не нужны были бы пляски с этими вашими экьюалитикомпарерами с этой их косвенностью и динамичностью, которые ещё и болт кладут на кастомные операторы сравнения типов.
23 июн 17, 18:33    [20586985]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Kazantsev Alexey,

В дельфях надо будет анонимную функцию сложения делать.
23 июн 17, 18:37    [20586993]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
rgreat
В дельфях надо будет анонимную функцию сложения делать

Уж лучше в RTTI...
23 июн 17, 18:42    [20587002]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Kazantsev Alexey
Уж лучше в RTTI...
Слоупочно.
23 июн 17, 18:53    [20587024]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
rgreat
Слоупочно.

Как раз наоборот. В конструкторе класса получаешь адрес метода, сохраняешь...
23 июн 17, 19:06    [20587049]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Kazantsev Alexey,

Картинка с другого сайта.
23 июн 17, 19:32    [20587124]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus: дженерики  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
rgreat,

Какие дженерики, такое и решение.
23 июн 17, 19:36    [20587130]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Delphi Ответить