Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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
Aston пишет:
На счёт значения New к Integer зачем ты вообще его применяешь к Integer это значимый тип на сколько я помню. К значимым типам конешно можно применять New но он ничего не делает и на сколько я знаю его не применяют к значимым типам. Почитай что такое в Нэт значимый тип и ссылочный тип или структура и класс - очень ценная информация.

Все у него правильно.
  1. Dim bb(,) As Integer = New Integer(,) {}

Этот код создает пустой двухмерный массив, 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
Spiritsun пишет:
Значит нет альтернативы?

Почему нет? Я предложил один из вариантов - использовать словарь, но конкретно говорить непросто, потому что не понятно что ты хочешь вообще получить, какую задачу решаешь.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам