Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.008 c
1-53506
Kinderrr
2004-02-05 22:39
2004.02.17
Удаление элементов списка.


1-53522
turonix
2004-02-04 16:17
2004.02.17
Проблемы с компилятором


1-53610
Delphi5.01
2004-02-07 15:02
2004.02.17
TStringGrid


3-53429
magic
2004-01-24 02:46
2004.02.17
Interbase in MDI


11-53441
Mikel
2003-06-03 12:38
2004.02.17
TreeView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский