Аналоги динамических массивов в TP, PascalABC |
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 не поддерживает. Используют аналоги:
далее к A можно применить выделение памяти GetMem и обращаться к массиву через указатели типа A^[i] В Примере классов с использованием этого такое выделение памяти приводит к сообщению о выходе за граница массива:
Сообщение отредактировано: eug - 21.06.2011 14:26 |
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 Сообщение отредактировано: IUnknown - 21.06.2011 14:46 |
eug |
21.06.2011 14:36
Сообщение
#3
|
Группа: Пользователи Сообщений: 3 Пол: Мужской Репутация: 0 |
Это по меньшей мере неумно. Уже миллион раз говорено: НЕ ЭКОНОМЬТЕ на описании типов. Иначе (при подобных описаниях) Паскалю все равно, сколько памяти выделено под указателем, как только индекс не помещается в тот диапазон, о котором Паскаль знает - вылет программы. Либо отключай контроль типов (крайне не советую этого делать), либо опиши тип так: type mA=array[1 .. 65520 div sizeof(TRab)] of TRab;, и работай совершенно спокойно... другими словами, обойтись без динамических массивов, выделив память по максимуму? |
TarasBer |
21.06.2011 14:50
Сообщение
#4
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> другими словами, обойтись без динамических массивов, выделив память по максимуму?
НЕТ. Памяти выделяй ровно столько, сколько надо. Просто при описании типа возьми границы с запасом. Это НИКАК не повляет на кол-во памяти, занимаемой указателем на этот тип, и на кол-во памяти, выделяемой процедой GetMem. Это влияет только на контроль границ. -------------------- |
IUnknown |
21.06.2011 15:08
Сообщение
#5
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата обойтись без динамических массивов, выделив память по максимуму? Описание типа не влияет на выделение памяти. // Что так:это будет массив элементов типа TRab. Только в первом случае индексация ограничена: от 1 до 1, а во втором - от 1 до сколько_поместится (читай, вылета при обращении к любому возможному индексу не будет). Выделение памяти начинается при описании переменной определенного типа или при использовании GetMem/New применительно к указателю (как раз твой случай). Но ты ж выделяешь столько, сколько надо, а не максимально возможное число байт? |
Текстовая версия | 28.04.2024 22:33 |