Форум: "Начинающим";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
ВнизДинамические массивы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.014 c