Razmernost4:=Length(VarArray[n]); // У второго измерения n-ной «строки» (количество столбцов)
Razmernost5:=Length(VarArray[1][1]); // У третьего измерения первой «строки» первого «столбца»
Razmernost6:=Length(VarArray[1][2]); // У третьего измерения первой «строки» второго «столбца»
Razmernost7:=Length(VarArray[n][m]); // У третьего измерения n-ной «строки» m-ного «столбца»
4. Обращение
VarArray[n][m][o][p][r]:=1; // :Integer // К элементу n-ной «строки», m-ного «столбца», // o-того «?», p-того «?», r-того «?»
5. Обнуление (освобождение памяти)
SetLength (VarArray, 0); // Всех сразу
Динамические массивы VI
Delphi 1
Например, если вам необходимо сохранить «GIZMOS» в вашем массиве, сделайте следующее:
CONST
MaxGIZMOS = $FFFF Div (SizeOf(GIZMOS)) { или что-то другое, смотря какой максимальный размер GIZMOS вы планируете...}
TYPE
pGIZMOArray = ^GIZMOArray;
GIZMOArray = Array[1..MaxGIZMOS] of GIZMOS;
VAR
TheGIZMOS: pGIZMOArray;
GIZMOcount: integer;
BEGIN
GetMem(TheGIZMOS,(GIZMOcount+1)*SizeOf(GIZMO)); {Нужна дополнительная единица, поскольку массив GetMem ведет отсчет с нуля…}
TheGIZMOS^[index] := Whatever;
ну и так далее…
TList — такой динамический массив. Для получения дополнительной информации обратитесь к электронной справке. Если вы хотите это делать сами, то вам необходимо использовать GetMem для получения указателя на распределенную динамическую память, и затем FreeMem для освобождения памяти, занятой динамическим массивом. Tlist сделает это за вас самым надежным образом.
Динамические массивы VII
Delphi 1
Существует несколько способов сделать это. Применять тот или иной способ зависит от того, какой массив вы используете — массив строк или массив чисел (целые, натуральные и пр.).
1. Если вам необходим простой динамический одномерный массив строк, я предлагаю вам взглянуть на компонент tStringList, он сам заботится о функциях управления и легок в использовании.
2. Если вам необходим динамический многомерный массив строк, вы также можете воспользоваться tStringList (в случае, если число элементов вашего массива не превышает лимит для tStringList, я полагаю он равен 16,000). Чтобы сделать это, создайте функцию линейного распределения как показано ниже:
Допустим у вас есть трехмерный массив строк, текущее измерение [12,80,7], и вы хотите найти элемент [n,m,x]. Вы можете найти этот элемент в приведенном одномерном массиве с помощью формулы ((n-1)*80*7 + (m-1)*80 + x). Затем вы можете использовать это в качестве индекса в tStringList. Для диманического изменения одной из границ массива, используйте метод tStringList Move, служащий как раз для таких целей. (Метод состоит из некоторых технологических внутренних циклов, но выполняются они очень быстро, поскольку tStringList манипулирует не с самими строками, а с указателями на них.)
3. Если вам необходим динамический одномерный массив чисел, то в общих словах я приведу его ниже, но есть масса мелких деталей. Объявите указатель на тип массива, имеющего максимальное количество элементов данного типа (помните о том, что Delphi-16 позволяет иметь типам область памяти, ограниченной 64K), например так:
type
bigArray: array[1..32000] of integer; {или ^double, или что-то еще}
pMyArray: ^bigArray;
затем распределите сам массив:
getMem (pMyArray, sizeof(integer) * n);
где n — количество элементов. После этого вы можете ссылаться на элементы массива следующим образом:
pMyArray^[51]
Не забудьте освободить массив с помощью FreeMem после того, как вы его использовали.
Изменить размер массива, определить новый указатель, перераспределить или обменяться с другим массивом можно так:
pTemp: ^bigArray;
getMem(pTemp, sizeof(integer) * newnumelements);
memcopy(pTemp, pMyArray, sizeof(integer)*n);
{n – количество элементов в pMyArray}