Помощь - Поиск - Пользователи - Календарь
Полная версия: Аналоги динамических массивов в TP, PascalABC
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
eug
полноценного открытого массива скажем type arr=array of integer;
Pascal не поддерживает. Используют аналоги:

type mA=array[1..1] of TRab;
pA=^mA;
var A: pA;


далее к A можно применить выделение памяти GetMem и обращаться к массиву через указатели типа A^[i]
В Примере классов с использованием этого такое выделение памяти приводит к сообщению о выходе за граница массива:

type
Trab=class
suc: Trab;
FIO: string;
NK: kf;
stavka: integer;
constructor Create(Fam:string;nkaf:integer);
end;
type mA=array[1..1] of TRab;
pA=^mA;
Type Tarr = class {динамический массив элементов Trab}
public
n: integer;
A: pA;
constructor Create;
procedure add(val: Trab);
end;
procedure Tarr.add(val: Trab);
var siz:word;
begin
n:=n+1; siz:=n*SizeOf(mA); GetMem(A,siz);
A^[n]:=val; //здесь при n>1 выскакивает ошибка выход за границы массива
end;

IUnknown
Цитата
type mA=array[1..1] of TRab;
Это по меньшей мере неумно. Уже миллион раз говорено: НЕ ЭКОНОМЬТЕ на описании типов. Иначе (при подобных описаниях) Паскалю все равно, сколько памяти выделено под указателем, как только индекс не помещается в тот диапазон, о котором Паскаль знает - вылет программы.

Либо отключай контроль типовграниц (крайне не советую этого делать), либо опиши тип так:
type mA=array[1 .. 65520 div sizeof(TRab)] of TRab;
, и работай совершенно спокойно...


А PascalABC прекрасно работает с дин. массивами, я не знаю, зачем понадобилось ТАМ применять подобную технику, если есть вот такая:

var
a: array of Integer;

// ...
a := new integer[20];
eug
Цитата(IUnknown @ 21.06.2011 15:29) *

Это по меньшей мере неумно. Уже миллион раз говорено: НЕ ЭКОНОМЬТЕ на описании типов. Иначе (при подобных описаниях) Паскалю все равно, сколько памяти выделено под указателем, как только индекс не помещается в тот диапазон, о котором Паскаль знает - вылет программы.

Либо отключай контроль типов (крайне не советую этого делать), либо опиши тип так:
type mA=array[1 .. 65520 div sizeof(TRab)] of TRab;
, и работай совершенно спокойно...

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

НЕТ.
Памяти выделяй ровно столько, сколько надо. Просто при описании типа возьми границы с запасом. Это НИКАК не повляет на кол-во памяти, занимаемой указателем на этот тип, и на кол-во памяти, выделяемой процедой GetMem. Это влияет только на контроль границ.
IUnknown
Цитата
обойтись без динамических массивов, выделив память по максимуму?
Описание типа не влияет на выделение памяти.

// Что так:
type mA=array[1 .. 1] of TRab;

// что так:
type mA=array[1 .. 65520 div sizeof(TRab)] of TRab;
это будет массив элементов типа TRab. Только в первом случае индексация ограничена: от 1 до 1, а во втором - от 1 до сколько_поместится (читай, вылета при обращении к любому возможному индексу не будет).

Выделение памяти начинается при описании переменной определенного типа или при использовании GetMem/New применительно к указателю (как раз твой случай). Но ты ж выделяешь столько, сколько надо, а не максимально возможное число байт?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.