Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2014, 13:22   #1
PierL
Пользователь
 
Аватар для PierL
 
Регистрация: 17.04.2014
Сообщений: 17
По умолчанию переменная длина динамического массива

Здравствуйту ребята! Подкажите пожалуйста как в программе изменять длину динамического массива?
Мне надо увеличивать.
К примеру по умолчанию ставлю SetLength(Mass,600000);
Потом получается массив меньше, либо больше.
Если ты хочешь, то ты можешь!
PierL вне форума Ответить с цитированием
Старый 18.04.2014, 13:26   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Потом получается массив меньше, либо больше
Не получается. Именно 600000 и получится, если вообще памяти достаточно, индекс для доступв от 0 до 599999
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.04.2014, 13:43   #3
PierL
Пользователь
 
Аватар для PierL
 
Регистрация: 17.04.2014
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Не получается. Именно 600000 и получится, если вообще памяти достаточно, индекс для доступв от 0 до 599999
Т.е. как задал сначала, так фиксированно и осталось?
Если ты хочешь, то ты можешь!
PierL вне форума Ответить с цитированием
Старый 18.04.2014, 13:48   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Все делается одной и той же процедурой SetLength. Не хватило изначально выделенной этой процедурой памяти, вызови ее еще раз с новым значением длины массива. Только старайся вызывать ее как можно меньшее количество раз.
northener вне форума Ответить с цитированием
Старый 18.04.2014, 13:50   #5
PierL
Пользователь
 
Аватар для PierL
 
Регистрация: 17.04.2014
Сообщений: 17
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Только старайся вызывать ее как можно меньшее количество раз.
Объясни пожалуйста, что будет? И меньше - это какой лимит?
Если ты хочешь, то ты можешь!
PierL вне форума Ответить с цитированием
Старый 18.04.2014, 13:58   #6
PierL
Пользователь
 
Аватар для PierL
 
Регистрация: 17.04.2014
Сообщений: 17
По умолчанию

допустим я создал массив длинной SetLength (mass, 10000000);
Получился у меня массив длинной 1000.
Я для этого создам два д.массива. Один - SetLength (mass1, 10000000); //по максималке.
второй SetLength (mass2, N);
N-кол-во записанных элементов в первый массив. (т.е. счетчик записей)

Потом перепишу первый во второй и получится нормальный массив.
как-то по деревенски, но думаю получится.
Если ты хочешь, то ты можешь!
PierL вне форума Ответить с цитированием
Старый 18.04.2014, 13:59   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от PierL Посмотреть сообщение
Объясни пожалуйста, что будет? И меньше - это какой лимит?
При увеличении размера массива как правило выделяется новый блок памяти, данные из прежнего блока копируются в новый. Затем прежний блок возвращается системе. Из-за этого адресное пространство процесса становится фрагментированным что в конце концов может привести к тому что в очередной раз не найдется свободный блок памяти нужного размера.
northener вне форума Ответить с цитированием
Старый 18.04.2014, 14:02   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от PierL Посмотреть сообщение
допустим я создал массив длинной SetLength (mass, 10000000);
Получился у меня массив длинной 1000.
Я для этого создам два д.массива. Один - SetLength (mass1, 10000000); //по максималке.
второй SetLength (mass2, N);
N-кол-во записанных элементов в первый массив. (т.е. счетчик записей)

Потом перепишу первый во второй и получится нормальный массив.
Ничего не понял. Зачем два массива? Зачем копировать из одного в другой? Непонятно.
northener вне форума Ответить с цитированием
Старый 18.04.2014, 14:25   #9
PierL
Пользователь
 
Аватар для PierL
 
Регистрация: 17.04.2014
Сообщений: 17
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Ничего не понял. Зачем два массива? Зачем копировать из одного в другой? Непонятно.
Мне нужен массив переменной длины (т.е. на выходе неизвестно какой четкой длины будет массив).
Если вызывать процедуру SetLength (в дальнейшем, для увеличения), то могут быть проблемы с памятью.

Чтобы проблем не было:

Что я хочу.
Я хочу создать два массива.
Пример:
1го длина 10000000 (10 млн элементов. ); //я его сделал такой длины чтобы не обращаться к проц.SetLength, а по максимуму. Пусть он заполнится до 1000, 10000000-1000=9999000 не заполнено, проверял, заполняется нулями.
2го длина будет 1000 (т.е. это длина кол-ва элементов записанных в первый массив). Фиксированная. Т.е. во втором массиве будет иметь 1000 элементов.
Потом я копирую 1000 элементов из первого массива во второй с фиксированной длиной 1000. Т.е. будет массив у меня такой как надо, без свободных мест. Потом мне с ним очень удобно работать будет.
Я так думаю
Не знаю только будет все нормально или не очень.
У меня проблемы с выражением своих мыслей.
Если ты хочешь, то ты можешь!

Последний раз редактировалось PierL; 18.04.2014 в 14:28.
PierL вне форума Ответить с цитированием
Старый 18.04.2014, 14:37   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Потом я копирую 1000 элементов из первого массива во второй с фиксированной длиной 1000. Т.е. будет массив у меня такой как надо, без свободных мест. Потом мне с ним очень удобно работать будет.
Дык вместо того чтобы делать второй массив вызови SetLength(Первый массив,1000) и будет у тебя массив "такой как надо, без свободных мест. Потом мне с ним очень удобно работать будет."
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
класс динамического массива mixon-21 Помощь студентам 0 26.08.2013 19:25
Длина многомерного массива Johnson Общие вопросы Delphi 2 18.02.2011 08:25
длина массива Артэс Общие вопросы C/C++ 4 06.10.2010 12:34
Освобождение динамического массива? VintProg Общие вопросы Delphi 15 28.08.2009 10:41
длина массива skif93 Microsoft Office Excel 2 24.11.2007 11:45