Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ограничение размера списка.

3.7K
10 марта 2009 года
0nni
326 / / 24.06.2008
Задумал нечто грандиозное но маленькое. С этой целью (для экономии времени) скопировал из Classes тип Tlist. В процессе "творческого копирования" обнаружил вот эту строчку:
 
Код:
MaxListSize = Maxint div 16;

Интересно, это ограничение "забыли" убрать (мне так кажется модуль classes давно не менялся). Или в этом есть какой то смысл?
Меня, честно говоря такие "детские" объемы не устраивают, если я поставлю там просто maxint, как думаете - в будущем проблем не будет?
1.8K
10 марта 2009 года
CilCatblack
251 / / 20.09.2007
Цитата: 0nni

Меня, честно говоря такие "детские" объемы не устраивают



Класс TList позволяет создать набор из произвольного количества элементов:)

3.7K
10 марта 2009 года
0nni
326 / / 24.06.2008
Странно, я всегда думал что Tlist это линейный список а это оказывается просто массив!
 
Код:
const
  MaxListSize = Maxint div 16;

type
  PPointerList = ^TPointerList;
  TPointerList = array[0..MaxListSize - 1] of Pointer;
  ...
  TList = class(TObject)
   private
   FList: PPointerList;

Нет, все без некоторой доработки увеличивать MaxListSize нельзя. Глянь вот сюда хотя бы:
Код:
procedure TList.Delete(Index: Integer);
var
  Temp: Pointer;
begin
  if (Index < 0) or (Index >= FCount) then exit;
    //Error(@SListIndexError, Index);
  Temp := Items[Index];
  Dec(FCount);
  if Index < FCount then
    [COLOR="Red"]System.Move(FList^[Index + 1], FList^[Index],[/COLOR]//maxint*4 копировать за раз не получится =(
      (FCount - Index) * SizeOf(Pointer));
  if Temp <> nil then
    Notify(Temp, lnDeleted);
end;

Значит буду писать свой линейный список...
1.8K
10 марта 2009 года
CilCatblack
251 / / 20.09.2007
Цитата: 0nni
Странно, я всегда думал что Tlist это линейный список а это оказывается просто массив!


TList это класс списка.

Цитата: 0nni

Значит буду писать свой линейный список...


Так используй ListBox:)

3.7K
10 марта 2009 года
0nni
326 / / 24.06.2008
[QUOTE=CilCatblack]TList это класс списка.[/QUOTE]
Пол часа назад я тоже так думал, если ты посмотришь исходники то поймешь что заблуждаешься (то же самое касается и TStringList).

[QUOTE=0nni]Задумал нечто грандиозное но маленькое.[/QUOTE] Стало быть пишу я на WinApi.
Ты знаешь как долго заполняется ListBox?!
 
Код:
SendMessage(list, LB_ADD, 0, Integer(lpztString));

А теперь попробуй сравнить:
 
Код:
For i := 0 to (MaxInt div 16) do ListBox1.Items.add('');

и
 
Код:
For i := 0 to (MaxInt div 16) do StringList.add('');


Я думаю тема закрыта.
261
10 марта 2009 года
ahilles
1.5K / / 03.11.2005
0nni, если ты хочешь сделать список, который позволит соджержать большое количество элементов, то всё равно 2 ГБ памяти это предел, вернее 536870912 элементов типа Integer (или pointer). Это предел для любой 32 битной программы под Windows, а 64 битные программы Delphi не умеет компилить.
3.7K
10 марта 2009 года
0nni
326 / / 24.06.2008
ahilles, ой! точно что то я разошелся. (так стыдно)
Цитата:
Delphi не умеет компилить.


fpc умеет =)

зы, "Убейся ап стенку" - это про меня =(

6
11 марта 2009 года
George
4.1K / / 05.01.2007
а какая среда то хоть? )
3.7K
11 марта 2009 года
0nni
326 / / 24.06.2008
Delphi 10 lite. Вообще и на fpc компилируется без проблем, но bdc это делает лучше.
Что то я вчера не так посчитал видимо. Калькулятор тоже убью об стенку.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог