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

Вниз

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

 
Alex2   (2005-12-22 08:21) [0]

Уважаемые мастера, у меня возник вопрос как же правильно работать с динамическими массивами.
Во многих примерах рекомендуется работать с ним через указатель:

TBoolArray = array[1..MaxBooleans] of boolean;
PBoolArray = ^TBoolArray;
B : PBoolArray;
...
GetMem(B, N*sizeof(boolean));
FreeMem(B, N*sizeof(boolean));

Но ведь когда работаешь через стандартный механизм:

TBoolArray = array of boolean;
B : TBoolArray;
...
SetLength(B, N);
B := nil;

массив B тоже представляет из себя указатель.
В чем отличие?


 
Digitman ©   (2005-12-22 08:26) [1]


> В чем отличие?


В случае стат.массива переменная B: PBoolArray содержит адрес первого элемента этого массива

В случае дин.массива переменная B: TBoolArray содержит адрес управляющей структуры этого массива, а не адрес его первого элемента


 
MBo ©   (2005-12-22 08:27) [2]

Первый способ использовался в основном до появления в Delphi4 динамических массивов, реализованных подобно длинным строкам. При этом выделение-освобождение памяти производится вручную, и нет механизма подсчета ссылок.


 
MBo ©   (2005-12-22 08:30) [3]

>адрес управляющей структуры этого массива, а не адрес его первого элемента

Для одномерного массива переменная указывает все же на первый элемент, а управляющая структура располагается по отрицательному смещению от него, хотя лучше в явном виде этим не пользоваться


 
TUser ©   (2005-12-22 08:49) [4]


> Для одномерного массива переменная указывает все же на первый
> элемент, а управляющая структура располагается по отрицательному
> смещению от него,

???
program Ar;
{$apptype console}
uses SysUtils;

type
PInt = ^integer;

var a: array of integer;
   p: pint;
begin
 SetLength (a, 3);
 a[0]:=10;
 writeln (inttostr(a[0]));
 p:=@a;
 writeln (inttostr(p^));
 p:=@a[0];
 writeln (inttostr(p^));
end.

Delphi 7.


 
MBo ©   (2005-12-22 08:57) [5]

>TUser
у тебя после
p:=@a;
p  - указатель на указатель
сделай
p:=PInt(a);


procedure TForm6.Button1Click(Sender: TObject);
var
 A:array of Integer;
begin
 SetLength(A,3);
 A[0]:=7;
 Caption:=Format("%p  %p   %d  %d",[A, @A[0], A[0], PInteger(A)^]);
end;


 
evvcom ©   (2005-12-22 09:19) [6]


> сделай
> p:=PInt(a);

2 TUser: А лучше через CPU Window посмотри. Более наглядно.


 
Sapersky   (2005-12-22 11:28) [7]

Ещё у дин. массивов (array of <...>) есть своего рода RTTI, точнее, TypeInfo. Содержит тип, размер элемента, наличие финализируемых полей (LongString и пр.) в элементе. Весьма полезно для написания универсальных функций.
Пример есть в JCL - официально для Delphi7, фактически TypeInfo у массивов присутствует по крайней мере с D5.
Ещё достоинство, вытекающее, надо полагать, из первого - содержимое дин. массива можно посмотреть при отладке.
Недостаток - несколько меньшая скорость доступа к элементу (особенно у многомерных массивов).


 
evvcom ©   (2005-12-22 12:16) [8]

Точнее не у дин.массивов, а типов описывающих дин.массивы. Тогда уж стоило сказать, что TypeInfo содержится также и у многих других сложных типов, таких как record, string... А у самих переменных нет никаких ссылок на их тип.


 
Alex2   (2005-12-22 15:49) [9]


> Недостаток - несколько меньшая скорость доступа к элементу
> (особенно у многомерных массивов).

А за счет чего уменьшается скорость, ведь фатически и там и там указатели?


 
Digitman ©   (2005-12-22 15:58) [10]


> Alex2   (22.12.05 15:49) [9]


За счет того что Делфи-компилятор  при большинстве "лобовых" программных обращений к дин.массиву вставляет неявный маш.код. который кроме собственно работы с данными массива оперирует еще и служебной инф-цией в той самой упр.структуре


 
Alex2   (2005-12-22 16:11) [11]


> За счет того что Делфи-компилятор  при большинстве "лобовых"
> программных обращений к дин.массиву вставляет неявный маш.
> код. который кроме собственно работы с данными массива оперирует
> еще и служебной инф-цией в той самой упр.структуре

А где бы узнать что конкретно компилятор дельфи при этом делает?


 
evvcom ©   (2005-12-22 16:31) [12]


> А где бы узнать что конкретно компилятор дельфи при этом
> делает?

View - Debug Windows - CPU


 
з. танька   (2005-12-22 18:25) [13]

а можно узнать, зачем он так делает?
ну, в двух словах?

а вообще мне кажется что Delphi это ОНИ.. (т.е. Дельфы по названию города)


 
evvcom ©   (2005-12-23 08:38) [14]


> а можно узнать, зачем он так делает?
> ну, в двух словах?

Как он (компилятор) делает, зависит от галок, установленных/сброшенных в его настройках (оптимизация, проверка ошибок на выход из диапазона допустимых индексов, ошибки ввода/вывода и пр.) Но есть и не зависимые от настроек действия такие как инициализация/финализация массивов, записей, стрингов и пр. Этого требуют особенности поведения типов. Ведь ты ж была бы недовольна, если бы приходилось самой в конце каждой процедуры/функции/метода писать код явного освобождения подобных структур. А так поставил end; и голова пусть у компилятора болит, как он будет освобождать весь этот теперь уже мусор.

> а вообще мне кажется что Delphi это ОНИ

А все зависит от того, что под этим подразумевается: компилятор - ОН, среда - ОНА, Дельфы - ОНИ. :)



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

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

Наверх




Память: 0.5 MB
Время: 0.06 c
2-1135275962
denisww
2005-12-22 21:26
2006.01.15
HTTPRIO


2-1135497900
kop
2005-12-25 11:05
2006.01.15
Запрос > мемо


14-1134759817
keymaster
2005-12-16 22:03
2006.01.15
Логические выражения


14-1135112474
sniknik
2005-12-21 00:01
2006.01.15
Разыскивается Файрвол!!!


1-1134130477
Антон1209
2005-12-09 15:14
2006.01.15
Скажите как правильнее написать процедуру добавления значения к м