Форум: "Потрепаться";
Текущий архив: 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.009 c