![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Массивы [D5, Win2k]
nimble © (2002-07-06 01:44:00)Вопрос такоко плана, есть запись типа:
TRec = rec
i: Integer;
r: Real;
s: String[30];
ch: Char;
end;
И массивчик ->mas: array[10001..65000] of TRec;
Из этого массивчика будет max"ум использовано 3000 записей, хотя памяти выделено на 65000-10001, явная неэкономия.
Как быть?
Anatoly Podgoretsky (2002-07-09 09:42:00) [1]О чем ты беспокоишьс об 2.3 мегабайте, нет смысла усложнять жизнь, статический массив.
Yuri-7 (2002-07-09 09:25:00) [2]
1.>Aleks1
Для работы с TList совсем не нужно record заменять на TObject.
2.> nimble
Когда ты объявляешь большой массив, это не значит, что ты занял какую-то память. Только когда ты начинаешь работать с элементами, тогда выделяется память.
Для твоей задачи нужно добавить в record номер и использовать TSortList.
nimble (2002-07-09 04:36:00) [3]А как насчет такого объявления
mas: array [10001..65000] of Array of TRec?
nimble (2002-07-09 04:20:00) [4]А что даст использование VirtualAlloc?
TTCustomDelphiMaster (2002-07-08 12:03:00) [5]
> nimble © (06.07.02 01:44)
Твоя задача легко решается если использовать базу данных.
Vitaly (2002-07-08 11:38:00) [6]nimble! MBo © (07.07.02 07:09) дело говорит.
Проще всего TList.indexOf (TList.sorted = true)
leshy (2002-07-08 10:30:00) [7]Настоятельно рекомендую: никогда не делайте динамических массивов не с нуля — некрасиво. Это раз.
Второе: сохранить размер выделяемого массива после его создания — это что, проблема? Или лень?
И последнее: если вы не уверены, что количество данных в массиве конечно, тогда объявляйте
type
PArray = ^TArray;
TArray = array[0..0] of TRec;
и работайте с PArray а не с TArray: создайте фунуцию ReallocArray, в которую передавайте количество записей, чтобы оно сохранялось в глобальной переменной.
А а если количество данных конечно, тогда тоже объявление, потом
hFile := CreateMapping($FFFFFFFF...и работайте с этим массивом в свопе. Если данные храняться в файле, то вместо $FFFFFFFF хандле файла.
Pointer(lpArray) := MapViewOfFile(hFile...
CloseHandle(hFile)
Для сортировки можно использовать TList — заполнить адресами элементов (@lpArray[I]) и сделать QuickSort.
А самое грамотное — приделать к этому всему движок, простой потомок TObject с полями P: PArray и FCount: integer, и методом ReallocArray. Плюсproperty Items[Index: integer]: TRec read ...; default;И не полоскать мозги.
MBo (2002-07-07 07:09:00) [8]путь 1: Хэш (hash) списки или массивы
2: Сводишь записи в сортированный по нужному полю, т.е. номеру, список, двоичный поиск по 3000 записей - всего ~12 сравнений.
nimble (2002-07-07 06:31:00) [9]> Может быть стоит подробнее описать задачу
Имеется список судов, чей код лежит в пределе от 10001 до 65000.
К каждому судно прилепляется куча параметров: название, ширина, длина и т.п. И если мне нужно получить инфо, скажем, по судну с кодом 45321, то при использовании дин. массива потребуется цикл, чего очень не хочется. А так, указал mas[45321].название и ВУАЛЯ!
Aleks1 (2002-07-07 04:33:00) [10]Насчет серьезности - просто я порой забываю рисовать смайлики.
А вот насчет конкретно вопроса???
Точно могу сказать, что понятие "индекс" тут никак не пройдет. Нужно искать другой путь.
Может быть стоит подробнее описать задачу?
nimble (2002-07-07 03:31:00) [11]Ладно, тогда такой вопрос: нужно выделить память под 3 записи и так чтобы к первому обращался с индексом 10001, ко второму - 12121, ну а к третьему - 45002. Вот как это сделать.
->To Aleks1
По поводу объетков, ты серьезно все воспринимаешь.
TTCustomDelphiMaster (2002-07-06 08:59:00) [12]Во времена охоты на птиродактелей, когда я начинал писать на basic"е в этих случаях я делал так:
создаем динамический массив mas of Trec и массивчик index [10001..65000] of word
Если нужно внести сорокпятьтысячпетсотшестой элемент добавляеш запись в динамический массив а в массив index[45506] = номеру добавленой записи в динамическом массиве.
Итого:
Перерасход памяти (65000-10001)*2 байт < 128 кБайт
Инструментарий на уровне детского сада :))))
NailMan (2002-07-06 05:15:00) [13]To Aleks1->
> Ну и ещё.Inc(Elem); - что это такое? Либо я отстал в освоении новых >версий Дельфи, либо это - увеличение на 1, что явно "НЕ ТО".
Если Elem - поинтер на структуру(Elem:^TRec), Inc(Elem) приводит к смещению(увеличению адреса в Elem) на Sizeof(Trec), тоесть
фактически будет аналогично mas[i+1]
И это явно то что я имел в виду под оператором Inc(Elem);
Aleks1 (2002-07-06 05:00:00) [14]Дык я же не о том, а
>nimble © (06.07.02 02:33)
И массивчик ->mas: array[10001..65000] of TRec;
Из этого массивчика будет max"ум использовано 3000 записей, хотя памяти выделено на 65000- 10001, явная неэкономия.
Как быть?
И ещё.
>nimble © (06.07.02 02:33)
И тут же в догонку такой вопрос, вот в примере выше выделяется память под 3000 элементов, а я ведь не знаю сколько их на самом деле. Как тут быть?
Ну и как тут быть без списка? Или динамического массива?
Ну и ещё.
Inc(Elem); - что это такое? Либо я отстал в освоении новых версий Дельфи, либо это - увеличение на 1, что явно "НЕ ТО".
NailMan (2002-07-06 04:40:00) [15]Если у него Win2k то лишняя память должна быть по определению.
А тормоза будут если прога будет обращаться N число раз в сек, где N стремится к очень большим числам.
Обычный поинтер это тебе не класс.
К сведению, команда х86 средней длины декодируетсяпроцессорм Атлон за 17 тактов, а П4 еще дольше(я уже не говорю об самом исполнении).
А при обращении к классу таких командочек обрабатывается о-го-го, не в пример ежели обращаться к поинтеру.
Aleks1 (2002-07-06 04:10:00) [16]2 NailMan © (06.07.02 04:01)
>To Aleks1>
>А зачем в простой программе надо какие-то объекты, листы и прочее Items?
>Лишняя память имхо + тормоза + излишество
> Выделяем поинтеру 2 метрабайта памяти... ???
Ну и у кого же лишняя память? И у кого же тормоза?
Aleks1 (2002-07-06 04:03:00) [17]2 nimble © (06.07.02 03:45)
> Я тебя переспросил,а ты в штыки :)
Ну, ведь ты же переспросил о моих нервах, так я же и ответили о них :)
> Я с объетками редко встречался, поэтому многово недопонимаю.
...
Ну может лучше уйти в управдомы? Без знания "объетков" - с Дельфи лучше не связывать свое будущее.
NailMan (2002-07-06 04:01:00) [18]GetMem(p,2 * 1024 * 1024);
Выделяем поинтеру 2 метрабайта памяти
FreeMem(P); Мочим его
Остальное ясно?
To Aleks1>
А зачем в простой программе надо какие-то объекты, листы и прочее Items?
Лишняя память имхо + тормоза + излишество
nimble (2002-07-06 03:45:00) [19]->Aleks1
Я с объетками редко встречался, поэтому многово недопонимаю. Я тебя переспросил,а ты в штыки :)
Aleks1 (2002-07-06 03:36:00) [20]2 nimble © (06.07.02 03:31)
Ты чё? Все мои знакомые утверждают, что такой флегмы как я, они никогда, нигде не встречали!