![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Есть программа в которой используются динамические массивы. Длина массива и записываемые данные узнаются по ходу выполнения программы(в результате сравнения в цикле) и соответственно заполняю массив следующим образом:
В программе таких массивов несколько и периодически, при большом количестве точек возникают ошибки "Access violation". Возможно такое заполнение массива использовать неправильно. Если неправильно, то подскажите как правильно. Заранее спасибо. |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
-------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Допустим сначала я установил длину массив 1, а затем инкрементировал переменную Ind1, то есть увеличиваю длину массива на единицу. |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Зачем устанавливать массиву одну и ту же длину Ind1 a раз?
-------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Извиняюсь одну строчку не скопировал.
|
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
В этом коде неправильно то, что массиву многократно меняют длину. Это приводит к многократному перевыделению памяти. Что в конце концов приводит к фрагментации памяти, а иногда и к её нехватке. Но причин для AV именно в этом коде нет. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
В программе 4 таких заполнений массивов,массивы могут быть очень большой длины.
Существуют ли другие способы реализации данной проблемы, ведь как я понимаю перевыделение памяти неправильно?? |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 9 Всего: 58 |
А что за объект?
|
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Неправильно понимаете. Во многих реальных задачах без перевыделения памяти под динамический массив никак не обойтись не создавая иные проблемы. Но вот многократное изменение размера "большого" массива при добавлении/удалении одного элемента размером 2 байта на его размер - это перебор! Нужно этот процесс как-то оптимизировать. А что-то советовать можно только зная вашу задачу. О чём Keeper89 и спросил. От себя спрошу. Что есть для вас "большой массив"? P.S. Поискал наспех в Блоге CodeMonkee, ничего не нашёл по теме. Хотя вроде бы что-то, когда-то именно там читал по этому вопросу. Или не там??? Это сообщение отредактировал(а) northener - 24.9.2011, 23:22 -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| VanHelsing |
|
||||||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Задача состоит в следующем.
Реализую свой алгоритм, он конечно неправильный и медленный, но других вариантов пока нет. Беру массив замыкаемых точек делю по принципу - четный, нечетный. Произвожу замыкание. Если нет ошибок, но записываю все возможные комбинации замкнутых точек. Например:
Если нет ошибок, то формируется следующий массив
Если ошибки есть, то массив записывается точно также. Потом происходит перемешивание массива и вся процедура повторяется. Далее я сравниваю два этих массива и выявляю в массиве с ошибка, только те точки, которые не содержатся в массиве без ошибок. Каждый из приведенных массивов у меня динамический и я их увеличиваю как приведено выше.
Например при размере в 100 точек, длина одного массива - 5000, а второго - 1250. |
||||||
|
|||||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
VanHelsing, а почему бы сразу не установить длину массива равную a? судя по коду у тебя длина статическая и вообще не меняется. Прям перед циклом сделай один раз SetLength(Arrti, a) и все.
Получится что то типа:
Если у тебя память все таки надо перераспределять, то посмотри как это сделано в каких-нибудь списках, например в TStringList(см свойство Capacity и связанные с ним методы + методы добавления). |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Не получится, потому что заранее неизвестно сколько раз выполнится условие. P.S. перед использование динамические массивы необходимо обнулять? Это сообщение отредактировал(а) VanHelsing - 25.9.2011, 11:02 |
|||
|
||||
| THandle |
|
||||||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Судя по коду, который ты дал не понятно. Там в любом случае длина массива становится равной a(так как ind1 изначально равен 1). Сделай как это делается в списках(или вообще через сами списки). Вот код добавления элемента в TStringList:
Если число элементов(FCount) = Количеству выделенной памяти, то перевыделяем.
Аналогичено можно сделать и у ебя. Сделать выделение памяти на, допустим 100 элементов, и добавлять. Как память кончится, выделить еще на какое-то Delta(10-20...). В конце можно ненужное подчистить. |
||||||
|
|||||||
| VanHelsing |
|
||||||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Представляю фрагмент кода
Получается команда
производит выделения памяти? |
||||||
|
|||||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Нет... Посмотри исходники TSTringList'а... Рассчет перераспределения происходит в Grow(см. мой пост выше). Там вызывается SetCapacity:
вот там память и перераспределяется. Тебе нужно просто заимствовать эту идею, либо уже готовое использовать. |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Получилось реализовать программу без использования динамических массивов.
THandle спасибо за совет, обязательно изучу этот вопрос в дальнейшем. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |