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