Страница: 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
       
    
       
  
 
    
Значит нет альтернативы? 
Почему нет? Я предложил один из вариантов - использовать словарь, но конкретно говорить непросто, потому что не понятно что ты хочешь вообще получить, какую задачу решаешь.