Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.01.14;
Скачать: CL | DM;

Вниз

Динамические массивы   Найти похожие ветки 

 
KostaRik ©   (2016-02-03 11:39) [0]

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

Код:
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, кроме способа с инкрементом указателя до места назначения? Неужели в Паскале нет адекватного способа работы с адресами? Мне никто не может ответить на этот вопрос уже месяц.
Всем заранее спасибо!


 
RWolf ©   (2016-02-03 12:04) [1]

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.


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

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


 
RWolf ©   (2016-02-03 12:12) [3]


> [1]

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


 
Dimka Maslov ©   (2016-02-03 18:30) [4]

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;

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


 
KilkennyCat ©   (2016-02-03 22:04) [5]

и утечка.


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


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

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


 
icWasya ©   (2016-02-05 13:53) [7]

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

>и утечка.

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


 
Dimka Maslov ©   (2016-02-05 14:51) [8]


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


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


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


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


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


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

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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2018.01.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.003 c
2-1454867320
JohnKorsh
2016-02-07 20:48
2018.01.14
Как открыть файл только для чтения.


2-1454258706
ramstain
2016-01-31 19:45
2018.01.14
type record


2-1454488797
KostaRik
2016-02-03 11:39
2018.01.14
Динамические массивы


2-1454046359
gedevan
2016-01-29 08:45
2018.01.14
Можно ли сделать запрос SQL из данных фиктивной таблицы?


1-1355981373
oren_yastreb
2012-12-20 09:29
2018.01.14
User Unit 5; вызывает ошибку