TIntegerList

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

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

TIntegerList

Сообщение Odyssey » 22.05.2010 23:04:32

Сегодня пытался найти класс - список целых чисел, наподобии TList/TStringList/TObjectList. Но:
* Найденные реализации для Delphi наследуются от TList, либо инкапсулируют его, и приводят Integer к Pointer и наоборот, со всеми вытекающими последствиями.
* Есть AcedUtils, где полностью своя реализация, но у неё контейнеры перегружены функциями, завязанными на остальную часть библиотеки, и неизвестная лицензия.
* Есть реализация на основе шаблонов, типа TIntegerList = specialize TFPGList<Integer>, но хотелось бы обойтись без них, возможно ещё придется компилировать на Delphi 7/2006
* Хотелось бы всех возможностей нормальных List'ов, типа предварительного выделения памяти под элементы и дихотомического поиска для отсортированных списков.

Может быть, у кого-нибудь есть на примете (или в работе) такой класс, чтобы не изобретать велосипед?
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: TIntegerList

Сообщение скалогрыз » 22.05.2010 23:55:12

Odyssey писал(а):Может быть, у кого-нибудь есть на примете (или в работе) такой класс, чтобы не изобретать велосипед?


Код: Выделить всё
TIntegerList = class(TList)
protected
  function GetIntValue(aIndex: Integer): Integer;
  function SetIntValue(aIndex, aValue: Integer);
public
  procedure RemoveInt(aValue: Integer);
  procedure AddInt(aValue: Integer);
  property IntValue[index: Integer]: Integer read GetIntValue write SetIntValue; default; // хз, позволит ли re-default :)
end;

implementation

{$WARNINGS OFF}{$HINTS OFF}

function TIntegerList.GetIntValue(aIndex: Integer): Integer;
begin
  Result:=Integer(Self.Items[aIndex]);
end;

function TIntegerList.SetIntValue(aIndex, aValue: Integer);
begin
  Self.Items[aIndex]:=Pointer(aValue);
end;

procedure TIntegerList.RemoveInt(aValue: Integer);
begin
  Remove(Pointer(aValue));
end;

procedure TIntegerList.AddInt(aValue: Integer);
begin
  Add(Pointer(aValue));
end;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: TIntegerList

Сообщение Timid » 23.05.2010 00:03:09

Ну нахера вам листы для списка целых чисел?!!!!!! (извините, не удержался) :)

Используйте уже динамические массивы и отстаньте! А сортировку и "сериализацию" для целых чисел делать.... оооооо!!!! Это вообще улет.
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: TIntegerList

Сообщение Odyssey » 23.05.2010 00:14:43

скалогрыз
Вот-вот, именно такой код я и находил :) А как же
Hint: Conversion between ordinals and pointers is not portable

? Что будет при компиляции под платформы, где Integer и Pointer имеют разный размер?

Timid
Листы мне нужны чтобы вместо
Код: Выделить всё
System.Move (MyList[Index+1], MyList[Index], (FCount - Index) * SizeOf(Integer));

и других трудночитаемых вещей писать
Код: Выделить всё
MyList.Delete(Index);

Например, сколько операций с массивами нужно сделать, чтобы получить такой же результат как тут:
Код: Выделить всё
MyListA.Assign(MyListB, laAnd, MyListC)

Если вы не используете эти возможности -- никаких проблем, пишите на массивах :) Мне эти возможности нужны, а код потом придётся читать, и не мне одному.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: TIntegerList

Сообщение Timid » 23.05.2010 00:45:46

А библиотечку функций написать?
Инкапсуляция ведь тебе не нужна, равно как и абстрации. Значит ООП для твоего случая - перебор.
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: TIntegerList

Сообщение Odyssey » 23.05.2010 01:43:24

С библитечкой, конечно, лучше чем без неё. И тем не менее, мне нужно предварительное выделение памяти, т.е. размер массива будет не равен числу реально занятых элементов в нём. Вот тут и пригодится инкапсуляция, а с массивами придётся добавлять по переменной на каждый экземпляр массива, и таскать их вместе с массивами в функции.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: TIntegerList

Сообщение скалогрыз » 23.05.2010 02:34:00

специально написал {$WARNINGS OFF} и {$HINTS OFF}
Odyssey писал(а):? Что будет при компиляции под платформы, где Integer и Pointer имеют разный размер?

ничего, кроме тех платформ, где sizeof(pointer)<sizeof(Integer)

про готовые классы не знаю, но на ум приходить, что-то вроде:
Код: Выделить всё
type
  TIntegerList = class
  private
    fcount : Integer;
  public
    data : array of Integer;
    procedure Assign(list: TIntegerList);
    procedure MoveFrom(list: TIntegerList; InsertPos, SourcePos, Count: Integer);
    procedure AddFrom(list: TIntegerList; InsertPos, SourcePos, Count: Integer);
    procedure Insert(FisrtIndex: Integer; const Values: array of Integer);
    procedure Delete(const Indexes: array of Integer);
    procedure MegaSort;
    procedure SuperSort;
    procedure SuperMegaSort;
    function SuperPooperFastSearch(value: Integer): Integer;
    property Count: Integer read fCount;
  end;

implementation

... собственно весь код уже написан, его нужно только перенести в класс..


ЗЫ: Соглашусь с Timid-ом, в том, что Integer "слишком простой и слишком базовый" тип данных, чтобы для него писать спец-класс обёртку. Хотя ничего предосудительного (или неправильного) в этом нет. Но может быть, для решения задачи, есть более "высокоуровневые" типы данных, для которых лучше писать обёртки?!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: TIntegerList

Сообщение Vadim » 23.05.2010 07:04:42

Odyssey
В GLScene есть класс - TIntegerList.
http://glscene.sourceforge.net/wikka/HomePage
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: TIntegerList

Сообщение Odyssey » 23.05.2010 12:46:42

скалогрыз писал(а):про готовые классы не знаю, но на ум приходить, что-то вроде:
...
... собственно весь код уже написан, его нужно только перенести в класс..

Да, именно так и сделал. Если кому-нибудь интересно, модуль прилагаю.

скалогрыз писал(а):... может быть, для решения задачи, есть более "высокоуровневые" типы данных, для которых лучше писать обёртки?!

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

Vadim писал(а):В GLScene есть класс - TIntegerList.

О, спасибо, его я не находил. Правда сейчас уже скопипастил то, что было нужно из RTL, но в GLScene довольно хорошая коллекция типов, возьму её на заметку.

Вобщем, всем спасибо, проблема решена. Прилагаю модуль IntegerList.pas. При необходимости, на его основе несложно сделать TInt64List, TDoubleList, TBooleanList и т.д. с помощью встроенного в Lazarus IDE движка шаблонов под названием SyncronEdit :)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: TIntegerList

Сообщение trubodur8 » 04.10.2019 18:54:05

В модуле IntegerList.pas ошибки, там где SizeOf(Pointer) придется исправить, если TLargeIntListItem сделаете не Integer
trubodur8
незнакомец
 
Сообщения: 1
Зарегистрирован: 04.10.2019 13:16:04


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

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

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

Рейтинг@Mail.ru
cron