![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамические массивы vs Статические массивы [D7, WinXP]
SH@RK © (2007-01-31 12:47:00)Существуют алгоритмы, память для работы которых выделяется во время их работы. Т.е. заранее неизвестен размер массива, с которым работает алгоритм.
Пример:
type
TNode = packed record
Child: packed array [0..31] of Word;
Parent: Word;
Final: LongBool;
end;
PArrNode = packed array of TNode;
var
Node: PArrNode; // динамич. массив
1)
В ходе выполнения алгоритма выделяю память кусками (по мере неоходимости):
Len := Length(Node);
SetLength(Node, Len + 100);
Я полагаю, что при этом элементы массива Node2^ располагаются в виртуальной памяти последовательно. Поэтому я допускаю работу с этим массивом как со статическим:
....
type
PArrNodeSt = ^TArrNodeSt;
TArrNodeSt = packed array [0..0] of TNode;
....
PArrNodeSt(Node)^[i] := ....
Вообще это дупустимо?
2)
Когда во внешней программе просчитывается этот алгоритм, то в файл с данными я записываю и кол-во элементов массива.
Поэтому в основной программе я выделяю память под этот массив при помощи GetMem (юзаю FastMM4).
Но при чтении этого массива как динамического (x := Node[i]), иногда возникают ошибки. Ошибки происходят в ф-ии модуля System @DynArrayClear (@FreeMem).
Как это понимать? При обычном чтении динамического массива происходит обращение к ф-иям выделения/освобождения памяти?
Теперь при любом методе выделения памяти под массив работаю с ним как со статическим массивом. Это допустимо?
DevilDevil (2007-01-31 13:24:00) [41]Так наверное правильнее:
x := Node[i].Child[j] ;
x := PArrNodeSt(@Node[0])^[i].Child[j];
SH@RK (2007-01-31 13:17:00) [42]Хотелось бы узнать чем отличаются динамические от статических массивов. Я не чётко понимаю работу с динамическими массивами. Как под них выделяется память?
Одинаково ли интерпретирует компилятор эти строки:
x := Node[i].Child[j] ;
x := PArrNodeSt(Node)^[i].Child[j];
GrayFace (2007-01-31 13:06:00) [43]Все допустимо, но не понятно, чем SetLength не устроил.
Сергей М. (2007-01-31 13:05:00) [44]Переменная типа дин.массив есть суть указатель на управляющую структуруэтого массива, а не на собственно данные, хранимые массивом.
MBo (2007-01-31 13:02:00) [45]packed array - packed не нужно, массивы всегда упакованы
А зачем приводить динамический массив к статическому типу, если синтаксис работы с ним никак не отличается?