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 14:29
Сообщение #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;
, и работай совершенно спокойно...


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

var
   a: array of Integer;

// ...
   a := new integer[20];


Сообщение отредактировано: IUnknown - 21.06.2011 14:46
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 

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