![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамический список [D7]
PinDOS © (2010-07-15 16:19:00)Здравствуйте уважаемые мастера!
Возникла необходимость создания списка подобного TStringList, но каждый элемент которого имеет, например, две переменные String и одну Byte. Обычно в таких случаях я писал свой класс на основе TObject, в котором использовал динамический массив. Потом задумался о эффективности моего кода:
1) я использовал проц. SetLength для динамического массива, в то время как в TStringList используется ReallocMem в чем разница?
2) я объявлял просто динамический массив наподобие
TArray: array of Byte;
PArray: ^TArray; // - переменная для работы с дин. массивом
а в TStringList
PStringItemList = ^TStringItemList; //почему идет обращение к типу который еще не объявлен, разве так можно?
TStringItemList = array[0..MaxListSize] of TStringItem;// - массив ограничен, что это дает в сравнении с используемым мною?
3) стоит ли делать как делал я или следует использовать имеющиеся возможности в делфи?
Спасибо!
Anatoly Podgoretsky (2010-08-24 12:12:00) [1]Удалено модератором
azamatufa (2010-08-24 12:01:00) [2]Удалено модератором
azamatufa (2010-08-24 11:54:00) [3]Удалено модератором
Anatoly Podgoretsky (2010-08-24 11:15:00) [4]> Сергей М. (24.08.2010 11:12:12) [12]
Разница в единстве.
В единстве наша сила.
Сергей М. (2010-08-24 11:12:00) [5]
> использовал проц. SetLength для динамического массива, в
> то время как в TStringList используется ReallocMem в чем
> разница?
В этом разрезе - ни в чем.
Вызов SetLength приводит к тому же самому, но неявному вызову ReallocMem
RWolf (2010-08-24 10:59:00) [6]Удалено модератором
azamatufa (2010-08-24 10:56:00) [7]Удалено модератором
Примечание: Задай свой вопрос в отдельной ветке
icWasya (2010-07-15 18:03:00) [8]Хватит троллить.
По поводу
>1) я использовал проц. SetLength для динамического массива, в то время как в TStringList используется ReallocMem в чем разница?
Исторически TStringList появился до динамических массивов. Не стали переписывать. Работает - не трогай.
2.1)в TStringList
PStringItemList = ^TStringItemList; //почему идет обращение к типу который еще не объявлен, разве так можно?
Если в одном блоке typeописывается сразу несколько типов,
то
a) можно использовать ссылку на тип, который ещё не описан, например PA=^TB
b) можно использовать предварительное описание, если тип - это класс, например
TB = class;
и в последующих строках использовать. Компилятор будет знать, что это указатель, и будет отводить место под поля такого типа место, как под указатель. Но в любом случае тип TB нужно будет определить в пределах того же блока type, где от впервые появился.
2.2) TStringItemList = array[0..MaxListSize] of TStringItem;// - массив ограничен, что это дает в сравнении с используемым мною?
При ручном выделении памяти (GetMem/FreeMem/ReallocMem) всё равно нужно так же вручную следить за выход за границу массива, а что бы компилятор не мешал, в типе TStringItemList установлен максимально возможный верхний индекс для массива типа TStringItem.
3) стоит ли делать - а вот тут на твой вкус. Если использовать стандартные возможности - то меньше писанины, но может оказаться чуть медленнее.
Если изобретать велосипед, то нужно чётко понимать, как оно устроено, что и когда делает, и самому следить за всеми деталями.
Удачи!
PinDOS (2010-07-15 17:53:00) [9]..а понял, сори)
PinDOS (2010-07-15 17:51:00) [10]
> Amoeba, Palladin
спс, буду с ним разбираться
> Больше никогда такого не пиши.
в чем собственно ошибка
Amoeba_ (2010-07-15 17:28:00) [11]
> Возникла необходимость создания списка подобного TStringList,
> но каждый элемент которого имеет, например, две переменные
> String и одну Byte.
TListItem = record
S1, S2: string;
N: Byte;
end;
Создавай элементы через New и храни их в TList.
> стоит ли делать как делал я или следует использовать имеющиеся
> возможности в делфи?
Определенно не стоит делать так, как делал.
Palladin (2010-07-15 17:27:00) [12]
> PinDOS (15.07.10 17:18) [3]
Тогда прочитай про TList.
... а так же про структурный тип - record, про указатели ты уже знаешь
Amoeba_ (2010-07-15 17:23:00) [13]
> PArray: ^TArray; // - переменная для работы с дин. массивом
> PStringItemList = ^TStringItemList;
Больше никогда такого не пиши.
PinDOS (2010-07-15 17:18:00) [14]
> А в чем особенность TStringList? Кою ты собираешься использовать
> для подобности
имел ввиду подобного в обращении, т.е. похожие функции вставки элементов, удаления, я с другими списками не работал, поэтому он для меня образец
Palladin (2010-07-15 16:36:00) [15]
> А чем особенность TStringList?
А вчем особенность TStringList?
Извиняюсь.
Palladin (2010-07-15 16:26:00) [16]
> создания списка подобного TStringList
А чем особенность TStringList? Кою ты собираешься использовать для подобности