Двухмерный массив

MMN

Well-known member
11.12.2008
97
0
#1
основывапясь на хелпе пытаюсь создать двухмерный массив.
если брать пример, то это выглядит так

Option Base 1
' Declare a two-dimensional dynamic array, of Variant type.
ReDim markMar(2, 2)
' Assign a value to each element.
markMar(1, 1) = 1
markMar(2, 1) = 2
markMar(1, 2) = 3
markMar(2, 2) = 4
' Change the upper bound of the last dimension of markMar
' from 2 to 3, preserving the values already stored in
' existing elements of markMar.
ReDim Preserve markMar(2,3)
' Assign values to the additional elements of markMar.
markMar(1, 3) = 5
markMar(2, 3) = 6


здесь наращивают второй элемент массива.
если я пытаюсь нарастить первый, то вылетаем в ошибку.
как всетаки правильно нарастить первый элемент ??
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#2
здесь скорее не наращивают второй элемент.. а переопределяют массив в целом
раньше массив был 2х2 стал 2х3
 
A

amigolinx

#3
если я пытаюсь нарастить первый, то вылетаем в ошибку.
А каким кодом пытаетесь нарастить первое измерение? Если объявить массив при помощи
Код:
Dim mArr As Variant
то потом можно будет наращивать при необходимости любое из измерений ;)
А в хелпе масиив объявлен явным образом - с изначальным заданием размерности, поэтому и позволяет менять только последнее измерение
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#4
amigolinx
Где массив задан явным образом???

автор, код в студию! чего ты там пишешь?
 
A

amigolinx

#5
NickProstoNick Может наспех некорректно выразился, я имел в виду что при конструкции типа ReDim markMar(2, 2) массиву задаются четкие границы и можно будет наращивать только последнее измерение (о чем кстати в том же хелпе и сказано)
 

MMN

Well-known member
11.12.2008
97
0
#6
ничего сверх гениального. хотел написать функцию по добавлению в двух мерный массив элементов.

здесь скорее не наращивают второй элемент.. а переопределяют массив в целом
раньше массив был 2х2 стал 2х3
хотел наращивать массив
2х2
3х2
4х2
5х2
 

nvyush

Lotus team
22.04.2009
2 317
0
#7
ничего сверх гениального. хотел написать функцию по добавлению в двух мерный массив элементов.


хотел наращивать массив
2х2
3х2
4х2
5х2
Так в хелпе же сказано - можно менять только границу последнего измерения, т.е
2х2
2х3
2х4
2х5
 
A

amigolinx

#8
MMN
Хм, прикол, однако... Я уж было чертечто подумал ;) А почему тогда наоборот не подходит наращивать по хелповскому? А там уж дальше читаем нужные элементы с нужных измерений...
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#9
можно... только ты потеряешь все данные массива
из этого выражения ReDim Preserve markMar(5,2) убери Preserve - получишь массив 5х2, но тогда все элементы обнулятся
Тут уже действительно получится переопределение массива... и переопределять можно любую границу
 

MMN

Well-known member
11.12.2008
97
0
#10
можно... только ты потеряешь все данные массива
из этого выражения ReDim Preserve markMar(5,2) убери Preserve - получишь массив 5х2, но тогда все элементы обнулятся
это я уже пробывал ))



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

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#11
как по мне через класс было бы на порядок менее геморойно
 
K

K-Fire

#12
вместо двумерного массива можно использовать список массивов. Т.е.

Dim yourArray List as Variant
Dim mass(1 to 2) as String

И дальше в цикле по i:

mass(1) = "aaaa"
mass(2) = "zzzz"
yourArray(cstr(i)) = mass

А вообще, лучше сразу вместо массива использовать классы, и вместо mass(i) использовать нормальные проперти объектов.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#14
MMN
простой пример

Код:
Class ClassAgent ' Инфа по агенту
Public Name As String
Public Alias As String
Public Comment As String
Public IsEnabled As Boolean
Public LastRun As Variant

Sub GetInfoFromAgent(Agent As Variant) ' Берем всю инфу из агента
Me.Name = Agent.Name
Me.Alias = Me.Name
If Instr(Me.Alias, "|")>0 Then Me.Alias = Strright(Me.Alias, "|")
Me.Comment = Agent.Comment
Me.IsEnabled = Agent.IsEnabled
Me.LastRun = Agent.LastRun
End Sub
End Class

Class MasClassAgent ' Массив агентов
Public Count As Integer
Public Rec() As ClassAgent

Sub New
Count = -1
End Sub


.......
End Class
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 583
269
#15
за достаточно долгую программистскую практику, использовал многомерные массивы только в "начале пути"
оправдано в математике, но в реальной жизни, редко сталкиваешься с необходимостью многомерных массивов