Domanda

Ho un'applicazione in VBA che dà alla mia VB.Net dll una variante bi-dimensionale. Si tratta di un una matrice, in cui ogni componente è un altro array contenente due posizioni.

Voglio ottenere questo array a due posizioni. Quando sto usando VBA posso accedere direttamente ai dati da ogni posizione facendo:

dataArray(index, 0) or dataArray(index, 1)

E quando voglio ottenere la matrice a due posizioni che posso usare:

Dim posArray as variant
posArray = dataArray(index)

posArray (0) contiene dataArray (indice 0) e posArray (1) contiene dataArray (indice, 1).

Ma quando sto usando VB.Net, posso accedere direttamente ai dati, proprio come il primo esempio. Tuttavia, quando provo ad ottenere una dimensione dalla matrice bidimensionale, come ho fatto nel secondo esempio, non è possibile.

Dim posArray as Object
posArray = dataArray(index)

Si dice "Tentativo di operare su un array con il numero corretto di dimensioni."

Ho provato di tutto per farlo funzionare, e non voglio fare l'attribuzione ad uno ad uno, come:

posArray(0) = dataArray(index, 0)
posArray(1) = dataArray(index, 1)

Grazie per l'aiuto.

È stato utile?

Soluzione

È necessario girare attraverso e generare la matrice 1D da soli. Non c'è alcuna libreria chiamata NET per farlo per voi.

dim arraySlice as string[yourArrayWidth]
for index = 0 to yourArrayWidth
  arraySlice[index] = yourArray[4, index]
next

L'esempio riportato sopra dovrebbe afferrare fila 4 di yourArray e bastone in arraySlice per voi. Naturalmente, si vorrà per pulire che fino e metterla in una funzione che accetta un rowIndex come parametro (e un'altra funzione per la scissione in senso verticale che accetta una columnIndex).

E 'piccole funzioni come questo che si raccolgono nel corso degli anni nella propria libreria di utilità. 5 anni da oggi, avrete bisogno di un ArraySlice e avrete già avere una funzione per farlo.

Altri suggerimenti

Dim Dim1Len As Integer = 5
Dim Dim2Len As Integer = 2
Dim DimToExtract As Integer = 2
Dim inMultiDArr(5, 2) As Integer
inMultiDArr = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}}
Dim outSingleDArr(5) As Integer
outSingleDArr = {0, 0, 0, 0, 0}

Buffer.BlockCopy(inMultiDArr, Marshal.SizeOf(GetType(Integer)) * Dim1Len * (DimToExtract - 1),
                 outSingleDArr, 0, Marshal.SizeOf(GetType(Integer)) * Dim1Len)

Dopo la BlockCopy 'outSingleDArr' conterrà {6, 7, 8, 9, 10}. Quanto sopra è stato derivato da questo post .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top