powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: дженерики
25 сообщений из 70, страница 1 из 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
25 сообщений из 70, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: дженерики
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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