[РЕШЕНО] Generic'и и ThreadList

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

[РЕШЕНО] Generic'и и ThreadList

Сообщение Brainenjii » 29.09.2011 14:05:44

Хочу сделать 2 списка - GList<T> и GThreadList<T>, так, чтобы метод LockList GThreadList'а возвращал GList, специализированный тем же типом, что и GThreadList. Это возможно сделать общим образом, или нужно переопределять LockList для каждой специализации GThreadList'а?
Последний раз редактировалось Brainenjii 29.10.2011 10:57:39, всего редактировалось 1 раз.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1345
Зарегистрирован: 10.05.2007 00:04:46

Re: Generic'и и ThreadList

Сообщение AlexVinS » 29.09.2011 14:45:30

Вроде можно. Надо в GThreadList<T> определить тип TLockList = specialize GList<T>; LockList будет выглядеть как function LockList: TLockList;
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: Generic'и и ThreadList

Сообщение Brainenjii » 29.09.2011 14:50:58

Вы не могли бы показать, как внутри класса объявить тип?

Добавлено спустя 12 минут:
Ещё одна странная проблема, наблюдается только в 1 Unit'e - когда пишу там
Код: Выделить всё
Type BObjectsList = Specialize BList<BObjectClass>;
Type BObjectsThreadTemplate = Specialize BThreadList<BObjectClass>;
Type

{ BObjectsThreadList }

BObjectsThreadList = Class(BObjectsThreadTemplate)
  Public
    Function LockList: BObjectsList;
End;

Я получаю ошибки на нереализованность методов:
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(16,14) Error: Forward declaration not solved "BList$BObjectClass.GetItem(LongInt):BObjectClass;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(17,15) Error: Forward declaration not solved "BList$BObjectClass.SetItem(LongInt,const BObjectClass);"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(21,15) Error: Forward declaration not solved "BList$BObjectClass.Add(const BObjectClass);"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(22,15) Error: Forward declaration not solved "BList$BObjectClass.Insert(const LongInt,const BObjectClass);"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(23,15) Error: Forward declaration not solved "BList$BObjectClass.Remove(const BObjectClass);"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(24,15) Error: Forward declaration not solved "BList$BObjectClass.Delete(const LongInt);"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(25,15) Error: Forward declaration not solved "BList$BObjectClass.Clear;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(26,15) Error: Forward declaration not solved "BList$BObjectClass.Purge;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(27,14) Error: Forward declaration not solved "BList$BObjectClass.Count:LongInt;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(28,14) Error: Forward declaration not solved "BList$BObjectClass.Get(const LongInt):BObjectClass;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(30,17) Error: Forward declaration not solved "constructor BList$BObjectClass.Build;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(31,16) Error: Forward declaration not solved "destructor BList$BObjectClass.Burn;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(42,15) Error: Forward declaration not solved "BThreadList$BObjectClass.Add(const BObjectClass);"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(43,15) Error: Forward declaration not solved "BThreadList$BObjectClass.Remove(const BObjectClass);"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(44,15) Error: Forward declaration not solved "BThreadList$BObjectClass.Clear;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(45,15) Error: Forward declaration not solved "BThreadList$BObjectClass.Purge;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(47,15) Error: Forward declaration not solved "BThreadList$BObjectClass.UnlockList;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(49,17) Error: Forward declaration not solved "constructor BThreadList$BObjectClass.Build;"
/home/Brainenjii/Develop/BaseUnits/trunk/bobjectunit.pas(50,16) Error: Forward declaration not solved "destructor BThreadList$BObjectClass.Burn;"

Если закомментировать все вхождения BObjectsList и BObjectsThreadList -> скомпилировать модуль -> раскомментировать все вхождения -> всё работает. До первой правки этого модуля. В чем может быть ошибка?

UPD. так, кажется ошибка из-за "циклической" ссылки между модулями - в BObjectUnit есть ссылка на BListUnit в разделе Interface, а в BListUnit - ссылка на BObjectUnit в Implementation...
Можно ли считать возникновение проблем из-за этого багом? ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1345
Зарегистрирован: 10.05.2007 00:04:46

Re: Generic'и и ThreadList

Сообщение AlexVinS » 29.09.2011 16:28:01

Brainenjii писал(а):Можно ли считать возникновение проблем из-за этого багом? ^_^

Да это баг, известный, но пока так и не исправленный. Циклические ссылки interface-implementation не рекумендуется использовать (иногда работает иногда вылезют странные ошибки). Но я не помню чтобы от этого появлялось "Forward declaration not solved".

Brainenjii писал(а):Вы не могли бы показать, как внутри класса объявить тип?


Код: Выделить всё
Type
{ BObjectsThreadList }

generic BObjectsThreadList <T> = Class
Public
  type
   TLockList = Specialize BList<T>
  private
   Flist: TLockList;
public
    Function LockList:TLockList  ;
End;
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: Generic'и и ThreadList

Сообщение Brainenjii » 30.09.2011 09:03:18

Попробовал сделать так ^_^ Получил Fatal: Internal error 200512115 ^_^ Что это может быть?

Добавлено спустя 1 минуту 51 секунду:
UPD. кажется нашёл - http://62.166.198.202/view.php?id=17193
Надо обновляться до 2.5.1? Кросс-компиляцию, так полагаю, опять придётся переделывать? :-(
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1345
Зарегистрирован: 10.05.2007 00:04:46

Re: Generic'и и ThreadList

Сообщение kipar » 30.09.2011 11:45:22

Стыдно признаться, но я перешел с Lazarus назад на Delphi - только из-за генериков.
В Лазарусе сначала пришлось отказаться от оптимизации, потом в разных местах добавлять бессмысленные строчки, которые обходили баги компилятора, потом появились рандомные нарушения памяти.
Перевел на Delphi XE - все заработало как часы. Ну и фич там побольше, например можно наследовать генерики и ограничивать подстановку типов. Надеюсь, Lazarus рано или поздно тоже до такого состояния доведут.
kipar
новенький
 
Сообщения: 78
Зарегистрирован: 04.03.2010 12:15:54

Re: Generic'и и ThreadList

Сообщение Brainenjii » 29.10.2011 10:57:18

Реализовал следующим образом:
Код: Выделить всё

Generic BThreadList<T, U> = Class
  Protected
    bInternal: TThreadList;
  Public

    Procedure Add(Const aValue: T);
    Procedure Remove(Const aValue: T);
    Procedure Clear;
    Procedure Purge;
    Procedure Load(Const aList:U);

    Function LockList: U;
    Procedure UnlockList;

    Constructor Build;
    Destructor Burn;
End;

...

Type BUsersList = Specialize BList<BUserClass>;
Type BUsersThreadList = Specialize BThreadList<BUserClass, BUsersList>;

Всё работает ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1345
Зарегистрирован: 10.05.2007 00:04:46

Re: [РЕШЕНО] Generic'и и ThreadList

Сообщение dreel » 14.12.2017 13:32:28

Brainenjii А можешь выложить полный код? Я пытался реализацию написать, мне Lazarus ругается ошибкой Error: VMT....
dreel
незнакомец
 
Сообщения: 1
Зарегистрирован: 14.12.2017 12:23:40


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru