![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамические массивы
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.