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

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

Динамические массивы vs Статические массивы [D7, WinXP]


Страницы:   1 2 3

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 не нужно, массивы всегда упакованы

А зачем приводить динамический массив к статическому типу, если синтаксис работы с ним никак не отличается?


Страницы:   1 2 3

Наверх

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