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

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

Массивы [D5, Win2k]


Страницы:   1 2

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...
Pointer(lpArray) := MapViewOfFile(hFile...
CloseHandle(hFile)
и работайте с этим массивом в свопе. Если данные храняться в файле, то вместо $FFFFFFFF хандле файла.
Для сортировки можно использовать 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)
Ты чё? Все мои знакомые утверждают, что такой флегмы как я, они никогда, нигде не встречали!


Страницы:   1 2

Наверх

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