IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Аналоги динамических массивов в TP, PascalABC
eug
сообщение 21.06.2011 14:13
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


полноценного открытого массива скажем 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;



Сообщение отредактировано: eug - 21.06.2011 14:26
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 21.06.2011 15:08
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
обойтись без динамических массивов, выделив память по максимуму?
Описание типа не влияет на выделение памяти.

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

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

Выделение памяти начинается при описании переменной определенного типа или при использовании GetMem/New применительно к указателю (как раз твой случай). Но ты ж выделяешь столько, сколько надо, а не максимально возможное число байт?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.06.2025 9:07
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"