powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: дженерики
70 сообщений из 70, показаны все 3 страниц
Lazarus: дженерики
    #39473812
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, решил попробовать их на вкус. Сделал, как в этом примере
сам код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
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}
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
0. c10
1. c10
2. c10
3. c10
4. c10
5. c10
6. c10
7. c10
8. c10
9. c10
10. c10

результат{2}
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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, то получаю
Код: pascal
1.
2.
3.
4.
5.
6.
[Window Title]
Ошибка
[Content]
Проект project1 вызвал класс исключения 'External: SIGSEGV'.
 По адресу 10C034
[ОК]


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

зы. кстати, компилятор выдал кучу хинтов типа
Код: pascal
1.
2.
3.
Компиляция проекта, цель: 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
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473813
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док ЧЯДНТ?
Cоздаёшь единственный объект, а потом удивляешься результату :)
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473815
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyДок ЧЯДНТ?
Cоздаёшь единственный объект, а потом удивляешься результату :)
понятно.
А что с разрушением?
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473816
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокА что с разрушением?
А чего ты ожидаешь убивая объект несколько раз? (я полагаю TFPGObjectList по дефолту является владельцем хранимых объектов).
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473817
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

поправил код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
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;


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


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

Я хочу уяснить на будущее, если я их не буду уничтожать, то память потечет?
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473819
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокНо даже теперь нет понятно, почему уничтожение и объекта, и листа все равно приводит к выше указанной ошибке.
Я же тебе уже сказал, что твой лист, скорее всего, сам удаляет хранимые объекты. Параметры конструктора-то посмотри.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473822
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ты в этих классах хранишь всего лишь свойства, как информацию о чём либо - то. То лучше использовать структуры, так как их не надо ручками создавать и удалять
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473823
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,
обычно у таких списков есть свойство "владелец объектов". Оно иногда по умолчанию включено, иногда - выключено, смотри исходники.
Это значит, что все, что ты положил в список, будет удалено (вызовом деструктора вложенного объекта) при разрушении списка.
Например, ты кнопки на форму кидаешь. Потом, при разрушении формы, кнопки тоже разрушаются.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473825
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 у хранимых объектов при уничтожении списка.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473837
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЕсли у тебя list.FreeObjects = True
Kazantsev AlexeyПараметры конструктора-то посмотри.
Ага, теперь понятно
Няшиклучше использовать структуры
Че-та я их не могу понять куда и и как в один из 4 классов (TFPGList, TFPGObjectList, TFPGInterfacedObjectList, TFPGMap), описанных в fgl, их прикрутить. Если создавать свой тип дженерика, как описано в мануале
Код: pascal
1.
2.
3.
4.
5.
6.
  generic TList<T> = class
    Items: array of T;
    procedure Add(Value: T);
  end;

  TRecList = specialize TList<TMyRec>;


то придется вручную описывать остальные свойства и процедуры. А хотелось бы готовых :)
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473839
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, вот с "созданием" записей:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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 играюсь... какой крутецкий отладчик, все элементы списка видно:
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473846
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Тебе не кажется что, создание указателя - это лишние ?
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473849
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, TList<> сам выделяет (и освобождает) память для данных типа <T>, и в данном случае fl.Add(fpR^) - всего лишь копирование значений из временной переменной.
Стало быть, в цикле должен быть Dispose этой временной переменной:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
    for i := 1 to c_Iter do begin
      New(fpR);
      fpR.i := i;
      fpR.s := '# ' + IntToStr(i);
      fl.Add(fpR^);
      Dispose(fpR);
    end;
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473851
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикчччД,

Тебе не кажется что, создание указателя - это лишние ?
Так Док вроде как раз страдает по этому поводу - куда непонятное заранее количество деть, массив какой-то завёл.
А так - да, не нужно.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473860
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДЭто я с Delphi Tokyo играюсь...
Вот теперь то же самое, только на Лазаре.

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

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

Есть сторонняя библиотека , но и там типа TList<TArray> тоже нет. Так что, для моих целей ближе всего все-таки использовать свой класс с полями нужного типа.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473866
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докчто дженерики на Лазаре гавно до уровня Дельфей еще надо пилить и пилить
Всё ровно наоборот. Муа-ха-ха.
ДокЕсть сторонняя библиотека , но и там типа TList<TArray> тоже нет.
Ты же на транке вроде? В транк давно уже спарту интегрировали, подключай Generics.Collections...
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473868
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

ну ты скажи, где лазарус взять, чтобы такой, как у тебя и без гемора при установке - я и попробую.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473871
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДну ты скажи, где лазарус взять
легко. Можешь попробовать собрать так .
Kazantsev Alexeyподключай Generics.Collections..
и ты молчал? :)
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473873
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокМожешь попробовать собрать так .
Зачем такие сложности... Ходишь сюда , качаешь утиль под свою ОС, устанавливаешь нажатием одной кнопки.

Доки ты молчал? :)
А ты не те вопросы задаешь
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473876
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скачал лазарус отсюда: http://www.lazarus-ide.org/ - нет там файла Generics.Collection

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

Да ну, страшно.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473878
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДСкачал лазарус отсюда: http://www.lazarus-ide.org/ - нет там файла Generics.Collection
ССЗБ
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473880
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyА ты не те вопросы задаешь
Мог бы и подсказать, тем более, что нас, лазаристов, мало :)

Вроде разобрался
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
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;

результат
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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> позаботится? Будет ли криминалом, если я буду по привычке уничтожать то, что создал своими руками?
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473881
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyчччДСкачал лазарус отсюда: http://www.lazarus-ide.org/ - нет там файла Generics.Collection
ССЗБ

Вот оно мне так надо.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473882
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док...
Еще раз хотел уточнить, FreeAndNil нужно писать или об этом TList<T> позаботится? Будет ли криминалом, если я буду по привычке уничтожать то, что создал своими руками?

Если у тебя в список TList<> залиты экземпляры классов - нужно уничтожать руками.
Если "простые типы" (целые, строки, записи из целых и строк...) - не нужно уничтожать. Если в записи есть поля "классового" типа ("объекты") - нужно пройтись по всем элементам и уничтожить такие объекты.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473883
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокFreeAndNil нужно писать или об этом TList<T> позаботится?
Конкретно TList<T> сам ничего не уничтожает. TObjectList<T> в зависимости от опции владения объектами.

ДокБудет ли криминалом, если я буду по привычке уничтожать то, что создал своими руками?
Это ортогонально дженерикам. Но вообще, либо уничтожаешь сам, либо поручаешь кому-то, как в том случае со списком-контейнером владеющим объектами.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473910
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДВот оно мне так надо
тебе 3 батника запустить поочередно гораздо сложнее, чем кликать 10 раз по кнопке "Next" в инсталляторе дельфей? Тогда понятно, почему ты так долго на D2007 сидел, а теперь пузыри пускаешь, увидев отладчик Tokyo :)

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

Kazantsev AlexeyНо вообще, либо уничтожаешь сам, либо поручаешь кому-то, как в том случае со списком-контейнером владеющим объектами.
Я ж спросил на конкретном примере, мне нужно уничтожать конкретно созданный мной экземпляр-контейнер RL или это сделает TList<T>? :)
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473930
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокЯ ж спросил на конкретном примере, мне нужно уничтожать конкретно созданный мной экземпляр-контейнер RL или это сделает TList<T>? :)
Разумеется, ты сам должен заботится об уничтожении списка.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39473941
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Спасибо. Собственно, теперь все.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474419
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашли generics.collection? Я его полтора года назад находил без проблем.
Нормальные в лазаре дженерики, насколько я знаю.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474508
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonНормальные в лазаре дженерики, насколько я знаю.
про которые из трех ты говоришь? :)

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

зы. Про "в лазаре дженерики" будет иметь смысл говорить, когда они будут, как минимум, в сорцах fpc лежать, ПМСМ.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474513
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокПро "в лазаре дженерики" будет иметь смысл говорить, когда они будут, как минимум, в сорцах fpc лежать, ПМСМ.
Спартовские в транке лежат. Ну и есть ещё fcl-stl.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474514
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Sparta. Вполне живые. Я как-то проблем с ними не замечал.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474657
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyСпартовские в транке лежат.
makhaonSparta. Вполне живые.
Наверное, единственные юзабельные, КМК.

Пошел пользовать. Алексу персональный спасиб за наводку
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474778
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Расскажи потом, в чём отличие от дельфовских.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474903
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Расскажи потом, в чём отличие от дельфовских
с дельфей слез лет 5 как, Лазарь с каждым релизом устраивает более, чем. Помочь не смогу :)
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474910
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Расскажи потом, в чём отличие от дельфовских.
Спартовские калька с дельфийских.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474955
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

я так понимаю, это был сарказм :)
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474960
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докя так понимаю, это был сарказм :)
Эм... Нет. Спартовские generics.collections есть калька с дельфийских generics.collections, и сделаны они были именно для совместимости с дельфями.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39474966
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,


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

Это со стороны Cobalt747, вероятно, был сарказм.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476727
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокЭто со стороны Cobalt747, вероятно, был сарказм.Отнюдь. Мне интересно узнать в чем отличаются дженерики свободного сообщества и коммерческого ПО.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476844
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747интересно узнать в чем отличаются дженерики свободного сообщества и коммерческого ПО
На уровне RTL ничем, на уровне языка фпц'шные дженерики это почти шаблоны, а дельфийские так, баловство.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476852
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyCobalt747интересно узнать в чем отличаются дженерики свободного сообщества и коммерческого ПО
На уровне RTL ничем, на уровне языка фпц'шные дженерики это почти шаблоны, а дельфийские так, баловство.

Пример кто-нибудь продемонстрирует?
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476859
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖышыПример кто-нибудь продемонстрирует?
Пример чего?
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476863
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Пример чем они круче.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476865
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatПример чем они круче
Ну попробуй на дельфях реализовать банальное сложение для типа <T>.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476866
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyrgreatПример чем они круче
Ну попробуй на дельфях реализовать банальное сложение для типа <T>.

Примера не будет?
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476871
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476882
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖышыПримера не будет?
Примера на дельфях не будет, ибо слишком много писанины, а на фпц это одна строчка: result := a + b;

rgreatПонятно.
Этим не ограничивается. Возьмём другой пример. У тебя коллекция имеющая метод ToString, который должен вернуть строковое представление всех хранимых данных. Писать такое на дельфийских дженериках - проще застрелиться, а на фпц'шных пишется элементарно:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
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. А если нужный тип не имеет такого метода, то для него пишется тайпхелпер реализующий этот метод. Аналогично всё будет работать и с любыми операциями приведения типов, и даже с учётом перегрузки операторов.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476886
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реализацию примера на дельфях я и так представляю, на лазарусе кто бы показал.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476890
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жышына лазарусе кто бы показал
Специально для тебя:
а на фпц это одна строчка: result := a + b;
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476892
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyЭтим не ограничивается. Возьмём другой пример. У тебя коллекция имеющая метод ToString, который должен вернуть строковое представление всех хранимых данных. Писать такое на дельфийских дженериках - проще застрелиться, а на фпц'шных пишется элементарноДа в общем ясно. В дельфях пое-аться надо пиcателю дженерик класса, а в лазаре его пользователю. :)
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476896
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

непонятно.

Для типа
Код: pascal
1.
2.
3.
4.
5.
6.
pRMyRec = ^RMyRec;
RMyRec = record
  o : TObject;
  i : Integer;
  pr : pRMyRec;
end;


- сложение покажи.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476904
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatа в лазаре его пользователю. :)
Шта? В дельфях тебе так же будет нужен метод ToString, если захочешь корректного представления, а не как ты его себе видишь. Только для этого ты с ещё с RTTI попляшешь, что конечно очень молодёжно и вообще передово.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476906
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жышысложение покажи
Переопределяешь оператор сложения в своём типе, а код дженерика остаётся прежним.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476912
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyЖышысложение покажи
Переопределяешь оператор сложения в своём типе, а код дженерика остаётся прежним.

Не-по-нят-но.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476913
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жышы,

Класс оператор сложения писать надо.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476915
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЖышы,

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

В где?
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476922
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жышы,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
pRMyRec = ^RMyRec;
RMyRec = record
  o : TObject;
  i : Integer;
  pr : pRMyRec;

  class operator Add(const A,B: RMyRec ): RMyRec; overload;
end;
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476926
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖышыНе-по-нят-но.
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Operator_Overloading_(Delphi)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
RMyRec = record
 ...
 Class Operator Add(Const ALeft, ARight : RMyRec) : RMyRec;

end;

...
Class Operator RMyRec.Add(Const ALeft, ARight : RMyRec) : RMyRec;
Begin
...
End;
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476927
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЖышы,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
pRMyRec = ^RMyRec;
RMyRec = record
  o : TObject;
  i : Integer;
  pr : pRMyRec;

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


А в лазарусе - не надо, сам собой сложится?
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476929
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyЖышыНе-по-нят-но.
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Operator_Overloading_(Delphi)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
RMyRec = record
 ...
 Class Operator Add(Const ALeft, ARight : RMyRec) : RMyRec;

end;

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


Это я знаю. Я не знаю, как в лазарусе.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476930
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жышы,

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

Там проблема сложить 2 абстрактных типа лежит на писателе генерик класса.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476934
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЖышы,

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

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

Вы меня путает. А ведь у меня уже есть собственный персональный путаник!
...
Может, кто-то покажет код и в лазарусе и дельфи?
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476937
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖышыЯ не знаю, как в лазарусе
В фпц также. Кому, как не автору типа знать, каким образом правильно выполнять операции над своим типом. Код дженерика при этом остаётся простым и неизменным.


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

Там проблема сложить 2 абстрактных типа лежит на писателе генерик класса.
Не надо, агащазблин. В дельфях тоже надо, иначе наскладываешь там абстрактно такого... Просто в дельфях придётся лезть за методом оператора в RTTI. В общем, дженерики дельфийские это боль. Будь они нормальными, не нужны были бы пляски с этими вашими экьюалитикомпарерами с этой их косвенностью и динамичностью, которые ещё и болт кладут на кастомные операторы сравнения типов.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476939
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

В дельфях надо будет анонимную функцию сложения делать.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476941
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВ дельфях надо будет анонимную функцию сложения делать
Уж лучше в RTTI...
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476943
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyУж лучше в RTTI...Слоупочно.
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476945
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatСлоупочно.
Как раз наоборот. В конструкторе класса получаешь адрес метода, сохраняешь...
...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476957
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

...
Рейтинг: 0 / 0
Lazarus: дженерики
    #39476958
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Какие дженерики, такое и решение.
...
Рейтинг: 0 / 0
70 сообщений из 70, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: дженерики
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]