Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
14-1135115407
markers
2005-12-21 00:50
2006.01.15
Картинка


2-1135320208
geonew
2005-12-23 09:43
2006.01.15
печать


14-1134751968
KvORubin
2005-12-16 19:52
2006.01.15
Ув. Знатоки !!! подскажите коротким словом


2-1135700702
Monro
2005-12-27 19:25
2006.01.15
11111


14-1135279886
В.И Мухин
2005-12-22 22:31
2006.01.15
Требуется программист





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский