Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамический список [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? Кою ты собираешься использовать для подобности


Наверх

Титульная страница Поиск, карта сайта Написать письмо