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

Вниз

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

 
hRGN   (2004-01-27 22:28) [0]

Правильно ли так освобождать память для динамического массива объявленного таким образом:

var
Ar : array [0..128] of array of array of Integer;

begin
SetLength(Ar[0],10,10);


end;

begin
Finalize(Ar);
end;


 
wnew   (2004-01-27 22:40) [1]

Как пишут С.Тейксера и К.Пачеко: достаточно Ar := nil;


 
hRGN   (2004-01-27 22:48) [2]


> wnew (27.01.04 22:40) [1]

Не получится, если б это был полностью динамический массив, тогда да... а так у меня еще в начале границы заданы...
Тогда прийдется делать цикл:

for n := 0 to 128 do
Ar[n] := nil;


Думаю, finalize будет достаточно, да?


 
GEN++ ©   (2004-01-27 23:32) [3]

>var
>Ar : array [0..128] of array of array of Integer;
>begin
>SetLength(Ar[0],10,10);

Если женщина замужем - то она замужем, а если она не замужем - то она свободна.

>Тогда прийдется делать цикл:
>for n := 0 to 128 do
>Ar[n] := nil;

Надо ли при расторжении брака подавать на развод на отдельные ее части ????


 
Юрий Зотов ©   (2004-01-28 00:36) [4]

> hRGN (27.01.04 22:48) [2]

Я думаю, что вот этого уже будет достаточно:
for n := 0 to 128 do Ar[n] := nil;

И не нужно руками вызывать finalize и пр. Об этом, по идее, должен позаботиться компилятор.

> GEN++ © (27.01.04 23:32) [3]

> Если женщина замужем - то она замужем, а если она не замужем -
> то она свободна.

IMHO, очень логичное высказывание. Спорить просто невозможно. Да и не нужно.

> Надо ли при расторжении брака подавать на развод на отдельные
> ее части ????

Не знаю. А Вы как считаете? И, кстати, "ее" - это кого?


 
hRGN   (2004-01-28 01:20) [5]


> Юрий Зотов © (28.01.04 00:36) [4]


> Я думаю, что вот этого уже будет достаточно:
> for n := 0 to 128 do Ar[n] := nil;
>
> И не нужно руками вызывать finalize и пр. Об этом, по идее,
> должен позаботиться компилятор.

А не проще ли самому написать маленькую строчку кода, вместо цикла, зачем усложнять? Результат одинаковый?


 
GEN ©   (2004-01-28 15:44) [6]

>>Юрий Зотов
Мой пример про замужество женщины призван вызвать у задавшего
вопрос ассоциацию с тем, что открытый массив является связанной
областью памяти сколько бы степеней свободы он не имел. При этом
имя массива является указателем на начало этой области. И как следствие самостоятельный ответ на свой вопрос, и ничего более.


 
Тимохов ©   (2004-01-28 15:50) [7]

Да на фиг вообще освобождать: если ar это локальная переменная процедуры, то после выхода из нее все и поудаляется.


 
Mystic ©   (2004-01-28 16:57) [8]

Поддерживаю предыдущего оратора.

У тебя два массива --- один фиксированый, другой динамический. При работе с фиксированым массивом, весь код по работе с ним неявно обвертывается блоком try..finally примерно следующим образом:

var
X: array [LOW_LIMIT..HIGH_LIMIT] of TSomeType;
begin
InitializeArray(X);
try
ProcBody;
finally
end
;
end;


Поєтому освобождение памяти для его элементов будет происходить автоматически (этим обеспечивается, в частности, корректная работа в случае, например, массива строк).

Сказанное подтверждает следующий test-case:

procedure TestProc;
var
X: array[0..9] of array of Integer;
begin
SetLength(X[0], 19);
SetLength(X[1], 8);
end;

procedure TMainForm.TestBtnClick(Sender: TObject);
var
StatusBefore, StatusAfter: THeapStatus;
begin
StatusBefore := GetHeapStatus;
TestProc;
StatusAfter := GetHeapStatus;

Memo.Clear;
PutInfo(StatusBefore, Memo.Lines);
Memo.Lines.Add("");
PutInfo(StatusAfter, Memo.Lines);
end;

procedure TMainForm.PutInfo(Status: THeapStatus; S: TStrings);
begin
S.Add(Format("TotalAddrSpace = %d", [Status.TotalAddrSpace]));
S.Add(Format("TotalUncommitted = %d", [Status.TotalUncommitted]));
S.Add(Format("TotalCommitted = %d", [Status.TotalCommitted]));
S.Add(Format("TotalAllocated = %d", [Status.TotalAllocated]));
S.Add(Format("TotalFree = %d", [Status.TotalFree]));
S.Add(Format("FreeSmall = %d", [Status.FreeSmall]));
S.Add(Format("FreeBig = %d", [Status.FreeBig]));
S.Add(Format("Unused = %d", [Status.Unused]));
S.Add(Format("Overhead = %d", [Status.Overhead]));
S.Add(Format("HeapErrorCode = %d", [Status.HeapErrorCode]));
end;


 
DiamondShark ©   (2004-01-28 17:09) [9]

А в CPU Window заглянуть -- не-а?
Всё там как надо вызывается, компилятор у-у-умный.


 
Юрий Зотов ©   (2004-01-23 13:43) [10]

> GEN © (28.01.04 15:44) [6]

А моя реплика была вызвана тем, что САМ массив Ar - это самый обыкновенный статический массив (а никакой не динамический и уж тем более не открытый). Но вот его ЭЛЕМЕНТЫ - это динамические массивы и поэтому ТРЕБУЮТ динамического выделения памяти. Кстати, по этой причине ВСЯ занимаемая массивом Ar память вовсе не является связной.

А вот "степени свободы массива" - это, по-моему, что-то новое. Нельзя ли чуть подробнее?


 
Тимохов ©   (2004-01-23 13:50) [11]


> его ЭЛЕМЕНТЫ - это динамические массивы и поэтому ТРЕБУЮТ
>

От кого требуют?


 
Юрий Зотов ©   (2004-01-23 13:57) [12]

> Тимохов © (23.01.04 13:50) [11]

От программиста.


 
Тимохов ©   (2004-01-23 14:00) [13]

А если не иницилизировать, то что - ошибка будет?


 
Юрий Зотов ©   (2004-01-28 19:24) [14]

> Тимохов © (23.01.04 14:00) [13]

Сразу - не будет. А при попытке обращения - будет.


 
Тимохов ©   (2004-01-28 19:27) [15]

Все-таки не ясно, что вы имеете в виду под инициализацией? Установку размера каждого массива? Или что-то еще?

Чесно слово не пойму...


 
Юрий Зотов ©   (2004-01-28 19:31) [16]

> Тимохов © (28.01.04 19:27) [15]

Необходимость вызова SetLength перед тем, как начать работать. Только инициализацией я это не называл, будьте точнее. Я называл это динамическим выделением памяти.


 
Тимохов ©   (2004-01-28 19:36) [17]


> , будьте точнее

Вы правы - буду точнее.

Вы тоже будте точнее:

> как начать работать


Обращение High(ar[0]) можно назвать "работать" или нет? Вы думаете, что для такого обращения надо делать setlength(ar[0], 0)?


 
Юрий Зотов ©   (2004-01-28 19:40) [18]

> Тимохов © (28.01.04 19:36) [17]

Вам скучно?


 
Тимохов ©   (2004-01-28 19:48) [19]

Юрий Зотов © (28.01.04 19:40) [18]

Юрий. Судя по всем Вашим ответам, Вы любите правильный подход к программированию с точки зрения методики.
В данном случае, я позволил себе уточняющий вопрос на фразу "ТРЕБУЮТ динамического выделения памяти". Вас нельзя поправить уточняющим вопросом? Нет? Хорошо, не буду.

Да, стало, скучно...


 
Юрий Зотов ©   (2004-01-28 20:05) [20]

> Тимохов © (28.01.04 19:48) [19]

> Вас нельзя поправить уточняющим вопросом?

Поправить ВОПРОСОМ? Хм... интересно... ну да ладно.

С моей точки зрения, было совершенно очевидно, что имелось в виду. Если с Вашей точки зрения это не так, то почему бы Вам не было просто взять - да и уточнить: "требуют перед обращением к элементам массива, но не требуют, если таких обращений нет".

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

На будущее - если Вам когда-нибудь снова захочется задать мне вопрос для детского сада (типа "Вы думаете, что для такого обращения надо делать setlength(ar[0], 0)?"), то перед этим примите, пожалуйста, во внимание, что азбуку я все же чуть-чуть знаю.


 
Тимохов ©   (2004-01-28 20:07) [21]


> На будущее - если Вам когда-нибудь снова захочется задать
> мне вопрос для детского сада (типа "Вы думаете, что для
> такого обращения надо делать setlength(ar[0], 0)?"), то
> перед этим примите, пожалуйста, во внимание, что азбуку
> я все же чуть-чуть знаю.

Юрий, то что Вы все знаете, я уверен.

На будущее учту :)))


 
Юрий Зотов ©   (2004-01-28 20:11) [22]

> Тимохов © (28.01.04 20:07) [21]

А напрасно Вы в этом уверены.


 
Тимохов ©   (2004-01-28 20:14) [23]


> А напрасно Вы в этом уверены.

Имелось в виду в дельфи все знаете.


 
Anatoly Podgoretsky ©   (2004-01-28 20:16) [24]

Тимохов © (28.01.04 20:14) [23]
Не думаю, а вот что любую задачу сможет решить в рамках любой версии Дельфи, нет сомнений.


 
Юрий Зотов ©   (2004-01-28 20:17) [25]

> Тимохов © (28.01.04 20:14) [23]

И это не так. Например, я не знаю, как совместить RegisterCustomModule с наследованием ресурсов. А хотелось бы.


 
Gero ©   (2004-01-28 21:00) [26]

Юрий Зотов © (28.01.04 20:17) [25]

Никогда бы не подумал, что Вы чего-то не знаете.


 
Gero ©   (2004-01-28 21:01) [27]

Юрий Зотов © (28.01.04 20:17) [25]

Никогда бы не подумал, что Вы чего-то не знаете.


 
Andryk ©   (2004-01-28 21:10) [28]


> Юрий Зотов © (28.01.04 20:17) [25]
> > Тимохов © (28.01.04 20:14) [23]
>
> И это не так. Например, я не знаю, как совместить RegisterCustomModule
> с наследованием ресурсов. А хотелось бы.

Да уж и на старуху бывает проруха (с) народ :о))))))


 
Германн ©   (2004-01-28 23:41) [29]

2 Тимохов

Более того, если не ошибаюсь из всех тех, кто на данный момент имеет значек Мастера, только АП и (может быть) Adder не задавали вопросы в форум. ("Потрепаться" я исключаю). Вот только уровень сложности вопросов там совсем другой.

2 Andryk © (28.01.04 21:10) [28]
Народ говорит поруха, а не проруха. :)))


 
GEN++ ©   (2004-01-29 02:09) [30]

>>Юрий Зотов ©
"Динамические массивы - это массивы, память для которых выделяется динамически и размерность
которых не известна заранее, во время компиляции"
(С.Тейксера и К.Пачеко)
здесь видимо не совсем точный перевод и
следует читать как "....память для которых выделяется динамически и размер которой не
известен заранее...."
Можно ли в приведенном автором вопроса примере определить при компиляции сколько массив
Ar займет памяти ? Можно сказать только что не менее 516 бай, следовательно Ar следует
все же отнести к динамическим массивам.
Теперь вопрос: а какую конкретно область памяти будет занимать масив Ar ? - конечно
не обязательно СМЕЖНУЮ но обязательно СВЯЗАННУЮ идентификатором (или с идентификатором) Ar
Теперь по вопросу "степеней свободы" массива: поскольку в приведенном автором вопроса
приере есть две возможности динамически изменять оъем памяти занимаемой массивом Ar, то
число "степеней свободы" у него равно 2 - по аналогии с числом степеней свободы у точки
лежащей на плоскости, по крайней мере я в этот термин вкладываю именно этот смысл.



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

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

Наверх




Память: 0.55 MB
Время: 0.014 c
6-53688
atruhin
2003-12-10 16:01
2004.02.17
Подскажите как на W2Kser определить имя пользователя


1-53611
mixi
2004-02-06 20:11
2004.02.17
XML


1-53547
MadGhost
2004-02-03 19:02
2004.02.17
регулярные выражения


7-53777
Kinder
2003-11-20 16:14
2004.02.17
Как узнать закрыт или открыт сидюк?


7-53781
Gaval
2003-12-02 09:55
2004.02.17
Реакция на и зменение контрасности монитора