Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамические массивы


KostaRik ©   (2016-02-03 11:39:00) 

Здравствуйте, господа форумчане! Мой вопрос почему-то удалили, но я спрошу еще раз.
Если:
я создаю запись

Код:
type some_type=record
   x:integer;
   y:integer;

и тип указателя на запись

Код:
type Psome_type=^some_type;

некоторую переменную

Код:
var arr:Psome_type;
     i:integer;

И создаю массив

Код:
GetMem(arr, 10*sizeof(some_type));

Как мне получить значение, находящееся по адресу arr[ i ] в Turbo Pascal 7.0, кроме способа с инкрементом указателя до места назначения? Неужели в Паскале нет адекватного способа работы с адресами? Мне никто не может ответить на этот вопрос уже месяц.
Всем заранее спасибо!


Dimka Maslov   (2016-02-08 10:37:00) [1]


> Так это только в DOS'е.


На то там и ключевое слово "Турбо".


Германн   (2016-02-06 00:21:00) [2]


> Dimka Maslov ©   (05.02.16 14:51) [8]

Так это только в DOS'е. И только по явно заданному адресу.


Dimka Maslov   (2016-02-05 14:51:00) [3]


> откуда она возьмётся?


От отсутствия FreeMem и/или блока try..finally


> Но в Паскале исторически не принято "работать с адресами
> в памяти".


В Турбо Паскале исторически был "массив" mem для прямого и безусловного доступа к памяти через пару сегмент-смещение.


icWasya   (2016-02-05 13:53:00) [4]

>И будет щастие.
>KilkennyCat ©   (03.02.16 22:04) [5]

>и утечка.

Насчёт утечки - поподробнее: откуда она возьмётся?


Германн   (2016-02-04 01:35:00) [5]


> Неужели в Паскале нет адекватного способа работы с адресами?
>  

Не знаю какие способы вы считаете адекватными. Но в Паскале исторически не принято "работать с адресами в памяти".


KilkennyCat   (2016-02-03 22:04:00) [6]

и утечка.


Dimka Maslov   (2016-02-03 18:30:00) [7]

type
 TSomeRec = record
   X, Y: Integer;
 end;
 PSomeRecArray = TSomeRecArray;
 TSomeRecArray = array[0..1000] of TSomeRec;

var
 arr: PSomeRecArray;

begin
 GetMem(arr, 10 * SizeOf(TSomeRec));

 a[0].X := 100;
 a[9].Y := 200;
end;

И будет щастие.


RWolf   (2016-02-03 12:12:00) [8]


> [1]

хотя нет, absolute p — это адрес самого указателя, так что не сработает.


кгшзх   (2016-02-03 12:10:00) [9]

адекватных операций с адресами всего две: сложение и вычитание.
какие тебе еще нужны операции с адресами?
для индексного же обращения к памяти нужны массивы.
но ты же сам от них отказался в пользу своего лисапета.


RWolf   (2016-02-03 12:04:00) [10]

type
 TSomeTypeArray = array [0..999] of some_type;
var
 p: Psome_type;
 a: TSomeTypeArray absolute p;

begin
 GetMem(p, 10 * sizeof(some_type));
 Writeln(a[1].x);
end.


Наверх

Титульная страница Поиск, карта сайта Написать письмо