Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
sunzh
Зарегистрирован: 13.05.2006 Сообщения: 19
|
Добавлено: Пн Июл 31, 2017 3:55 pm Заголовок сообщения: Удалении произвольного элемента в массиве |
|
|
При удалении элемента из массива и уменьшения его размера выражением ReDim происходит потеря данных., как быть? Создавать сначала уменьшенную копию и перезаполнять с пропуском удаляемого элемента? Кто что думает? |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Вт Авг 01, 2017 5:43 pm Заголовок сообщения: |
|
|
Согласно документации ReDim не гарантирует сохранение данных (только в случае расширения массива). Поэтому - да, перекидывать в другой массив. Второй вариант - не уменьшать массив, заполнять "удаляемые" элементы заведомо невозможным значением в рамках задачи, которое потом при обходах массива не учитывать (пропускать). |
|
Вернуться к началу |
|
|
sunzh
Зарегистрирован: 13.05.2006 Сообщения: 19
|
Добавлено: Чт Авг 03, 2017 6:13 pm Заголовок сообщения: |
|
|
Dim DropItemIndex, i, j,m As Integer ' DropItemIndex - Удаляемый элемент
Dim Copy(), Original () As string
i = UBound(Original)
j = i - 1
ReDim Copy (j)
k=1
m=1
Do While k <= i
If k = DropItemIndex Then
m = m - 1
Else
Copy(m).Name = Original(k)
End If
k = k + 1
m = m + 1
Loop
ReDim Original(j)
For k = 1 To j
Original(k) = Copy(k)
Next
3 дня искал (не тривиально оказалось) |
|
Вернуться к началу |
|
|
sckameikin22
Зарегистрирован: 02.05.2018 Сообщения: 2 Откуда: Санкт-Петербург
|
Добавлено: Ср Май 02, 2018 4:36 pm Заголовок сообщения: |
|
|
Интересные ссылки. |
|
Вернуться к началу |
|
|
Alex_Y
Зарегистрирован: 28.11.2008 Сообщения: 122
|
Добавлено: Вт Май 15, 2018 3:38 pm Заголовок сообщения: |
|
|
sunzh писал(а): |
Dim DropItemIndex, i, j,m As Integer ' DropItemIndex - Удаляемый элемент
Dim Copy(), Original () As string
i = UBound(Original)
j = i - 1
ReDim Copy (j)
k=1
m=1
Do While k <= i
If k = DropItemIndex Then
m = m - 1
Else
Copy(m).Name = Original(k)
End If
k = k + 1
m = m + 1
Loop
ReDim Original(j)
For k = 1 To j
Original(k) = Copy(k)
Next
3 дня искал (не тривиально оказалось) |
Зачем такие сложности? Вам предложили отличный вариант, пишите в удаляемый элемент, например "NAN". Потом, при обходе, проверяйте на него и пропускайте. И память сэкономите, без всяких доп.массивов, и в скорости работы выграете, и размер кода раза в четыре меньше. |
|
Вернуться к началу |
|
|
|