Страница: 1 |
Страница: 1 |
Вопрос: Динамические массивы
Добавлено: 24.01.10 21:48
Автор вопроса: Spiritsun
Как добавлять индексы в массивы без границ без потерь значений?
Dim bb(,) As Integer = New Integer(,) {}
Dim cc(,) As Integer = New Integer(,) {}
bb = New Integer(1, 1) {}
bb(0, 0) = 1
bb(0, 1) = 1
bb(1, 0) = 1
bb(1, 1) = 1
cc = bb.Clone
bb = New Integer(2, 1) {}
bb(2, 0) = 2
Array.Copy(cc, bb, cc.Length)
Erase cc
в результате сохраняются старые данные массива bb(). Подскажите как это грамотно провернуть без лишних массивов и зря потраченных ресурсов.
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #1
Добавлено: 24.01.10 22:28
Как я понял bb выполняет роль буфера какого-то, вопрос, а использование массива в качестве переменной оправдано? Может заменить его структурой?
Номер ответа: 2
Автор ответа:
Spiritsun
Вопросов: 15
Ответов: 44
Профиль | | #2
Добавлено: 24.01.10 23:31
наоборот сс - буфер, потом удаляется из памяти. А bb - это раздуваемый массив. А что за структура, с чем это едят? Простой пример хотябы.
Номер ответа: 3
Автор ответа:
Aston
Вопросов: 15
Ответов: 7
Профиль | | #3
Добавлено: 25.01.10 01:01
На счёт значения New к Integer зачем ты вообще его применяешь к Integer это значимый тип на сколько я помню. К значимым типам конешно можно применять New но он ничего не делает и на сколько я знаю его не применяют к значимым типам. Почитай что такое в Нэт значимый тип и ссылочный тип или структура и класс - очень ценная информация.
ReDim массив(5,5) изменение размера массива без сохранения данных массива.
ReDim Preserve массив(5,5) изменение данных массива с сохранением данных.
Номер ответа: 4
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 25.01.10 06:27
На счёт значения New к Integer зачем ты вообще его применяешь к Integer это значимый тип на сколько я помню. К значимым типам конешно можно применять New но он ничего не делает и на сколько я знаю его не применяют к значимым типам. Почитай что такое в Нэт значимый тип и ссылочный тип или структура и класс - очень ценная информация.
Все у него правильно.
Этот код создает пустой двухмерный массив, 0 на 0 элементов.
По теме - изменить размер существующего массива без потери информации можно, но в случае двухмерного массива изменять можно только последнюю размерность.
Если нужно менять не только последнюю размерность, то нужно создавать новый массив нужного размера и в него копировать элементы из старого.
Может тебе вообще не массив нужен? А, к примеру, словарь, в котором роль ключа выполняет пара значений?
Номер ответа: 5
Автор ответа:
Spiritsun
Вопросов: 15
Ответов: 44
Профиль | | #5
Добавлено: 25.01.10 11:29
Aston, да, ты прав на счет New, я так и делал, просто при написании примера брал инфу с хелпа. По сути разницы никакой, как пишется в книгах компилятор сам подставляет New. Artyom, на счет ReDim да, вот именно, тока последняя размерность. Значит нет альтернативы? Лан, и так вобщем пайдет, богу слава массив не такой большой. Пасиб. А такт вобще использую динамический массив массивов Вот часть кода:
Private Const bibend = 9
Dim block(bibend)(,) As Integer ' для каждого типа блока X,Y. Формат: (блок) (поряд ном, 0) = X, (блок) (поряд ном, 1) = Y
Dim blocktmp(bibend)(,) As Integer
Const mx As Byte = 0
Const my As Byte = 1
...
block(t) = New Integer(0, 0) {}
--- цикл
blocktmp = block.Clone
block(t) = New Integer(block(t).GetUpperBound(0) + 1, 1) {}
block(t)(block(t).GetUpperBound(0), mx) = i
block(t)(block(t).GetUpperBound(0), my) = j
Array.Copy(blocktmp(t), 0, block(t), 0, blocktmp(t).Length)
--- конец цикла
Erase blocktmp
Номер ответа: 6
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #6
Добавлено: 25.01.10 15:40
Значит нет альтернативы?
Почему нет? Я предложил один из вариантов - использовать словарь, но конкретно говорить непросто, потому что не понятно что ты хочешь вообще получить, какую задачу решаешь.