![]() |
| ||
|
|
Новости |
Поиск |
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, явная неэкономия.
Как быть?
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]Используй динамический массив