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, явная неэкономия.
Как быть?


nimble   (2002-07-06 03:31:00) [21]

->NailMan
Объясни, плз, первую строчки:
GetMem(p,2 * 1024 * 1024);
Не вкуриваю ее предназначение!
->Aleks1
А ты че такой нервный?


Aleks1   (2002-07-06 03:21:00) [22]

Ну как? А молча.
TRec(MyList.Items[i]).ch:=#32;
или MyRealValue:=TRec(MyList.Items[i]).r;


NailMan   (2002-07-06 03:20:00) [23]

Вообще память не жалей(все равно МД разберется с ней как надо).
Если не знаешь сколько будет элементов делай так:

Var P:pointer;
Elem:^TRec;

GetMem(p,2 * 1024 * 1024);
Elem:=p; //Ремапнули элемент на кэш(фактически РЕСЕТ)
Inc(Elem,3001); //Обращаемся к 3001му элементу
Elem^.s:="Vasya Pupkin - Special For Master of Delphi";
А если надо в цикле заполнять:
Elem:=p;
For i:=0 to N do
Begin
Elem^.s:=Inttostr(i); //что-то делаем
....
Inc(Elem);
End;

Выгоды
- Работать в принципе должно быстрее нежели если массив-фактическая переменная,
- Элементов хоть мульон,
- Кэш можно использовать несколькими структурами, по аналогичному принципу(если надо сохраняй его на винт в файл).


Еще вопросы?


nimble   (2002-07-06 03:13:00) [24]

->Aleks1
С объектами небольшая напряженко, как потом с ним работать?


Aleks1   (2002-07-06 03:06:00) [25]

2 nimble ©
Попробуй заменить TRec = record
на TRec = class(TObject)
и храни их в TList.


nimble   (2002-07-06 02:55:00) [26]

->NailMan
К сожалению, если выделяю память на 3000 элементов, как в примере, а нужно обратиться к 3001, то ничего не выходит:(!!!


nimble   (2002-07-06 02:33:00) [27]

И тут же в догонку такой вопрос, вот в примере выше выделяется память под 3000 элементов, а я ведь не знаю сколько их на самом деле. Как тут быть?


nimble   (2002-07-06 02:25:00) [28]

->NailMan
Выглядит шикарно! Нуна попробовать, спасибо за инфо!


NailMan   (2002-07-06 02:20:00) [29]

Используй динамический ограниченный массив

Пример:
Я делал проект как консольное приложение

type
TRec = record
i: Integer;
r: Real;
s: String[30];
ch: Char;
end;
Tmas = array[10001..65000] of TRec;

var
Mas : ^TMas;

begin
GetMem(Mas,Sizeof(TRec)*3000);
Mas^[10010].s:="Vasya Pupkin";
Writeln(Mas^[10010].s);
readln;
FreeMem(Mas);
end.

Итог работы : "Vasya Pupkin"

Вуаля!


nimble   (2002-07-06 01:56:00) [30]

Ну а если мне нужно обратиться, скажем, к 45321"му элементу массива, мне придется делать цикл, а так сразу обратился. Я читал что в таких ситуациях используют VirtualAloc. Есть соображения?


Pat   (2002-07-06 01:46:00) [31]

Используй динамический массив


Страницы:   1 2

Наверх

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