![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамические масивы
Malder © (2002-08-14 20:57:00)Если изменять длину динамич. масива (setlength), то адреса его элементов в памяти меняются. Можно сделать так, чтоб не менялись ?
Anatoly Podgoretsky (2002-08-15 00:20:00) [1]Malder © (14.08.02 23:18)
Конечно это допустимо, но все таки 2гб
Геннадий (2002-08-14 23:29:00) [2]Windows имеет привычку скидывать данные на диск... Хотя, кто её знает, исключения она "любит"!
Malder (2002-08-14 23:18:00) [3]Ну да. Понятно. Значит никак...
Видимо, массив и его элементы должны в памяти идти "подряд". И если setlength увеличивает размер массива, то дырки в памяти может не хватить и будет искаться более длинная свободная цепочка памяти. Потому как, если setlength уменьшает размер массива, то адрес массива не меняется. Вроде.
И вот отсюда что подумалось. Даже если с лихвой хватит памяти для выделения места под массив, то может не хватить именно такой длинной свободной последовательности памяти. И соответственно, масив не выделется, setlength вызовет исключение. Правильно ?
Юрий Зотов (2002-08-14 22:32:00) [4]Из хелпа:
For a long-string or dynamic-array variable, SetLength reallocates the string or array referenced by S to the given length. Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined.
Итак, в общем случае адреса уже имеющихся элементов меняются - поскольку меняется адрес самого массива. Разве что он случайно окажется распределен на то же самое место - но это случайно.
Если это принципиально важно, то можно использовать статический массив заведомо достаточного размера и вести счетчик реально заполненных элементов.
Но это совсем не лучший способ. Лучше попытаться пересмотреть подход к задаче.
Геннадий (2002-08-14 22:13:00) [5]При увеличении длины новые элементы добавляются в конец и по началу их значения не определены. При урезании массива - удаляются конечные элементы. То есть:
Дано:
Ar = (1, 2, 3, 4, 5);
Setlength(Ar, 7); => Ar = (1, 2, 3, 4, 5, ?, ?);
Ar[6]:= 6; SetLength(Ar, 6); => Ar = (1, 2, 3, 4, 5, 6);
По-моему, так.
Anatoly Podgoretsky (2002-08-14 21:55:00) [6]Это врядли, этим они не отличаются от длинных строк